JeuWeb - Crée ton jeu par navigateur
Stockage relationnel en BDD - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Stockage relationnel en BDD (/showthread.php?tid=6358)



Stockage relationnel en BDD - Angelblade - 28-08-2012

Le sujet a été abordé ici: Gestion Inventaire

Le but est d'être capable de sauvegarder les objets en possession d'un joueur. Sans parler du moyen technique d'y parvenir je vais présenter comment je vois les choses à travers du JavaScript.


// ces deux variables représentent des objets tel qu'on pourrait les stocker en BDD
var potion = {id: 12, name: 'potion'};
var sword = {id:13, name:'sword'};

// player provient d'une autre table. Il possède trois items: deux potions (12) et une épée (13)
var player = {
name:'jean',
items: [12,13,12]
};

Si on relie les objets au joueur comme ceci le problème suivante se pose:
Imaginons que le joueur utilise items[0] et qu'au même moment un autre cherche à lui voler items[0]. La base de donnée va supprimer items[0] puis voler items[0] qui seras devenu entre temps items[1];

Je ne peux donc pas dire à la BDD supprime items[0] puisque items[0] peut changer.
Je ne peux pas non plus demander à supprimer l'item d'id 12 puisque ici il y a deux fois l'id 12.
J'ai donc pensé qu'il faut créer un id représentant items[0]:

player.items = [
{id: 27, itemId: 12},
{id: 30, itemId: 13},
{id: 31, itemId: 12},
]

Si on veut agir sur items[0] on agit par l'id 27. De cette manière on est sur d'agir sur le bon objet.

Il est possible de regrouper les items ayant le même id:
player.items = [{itemId:12, count:2}];
Quand j'utilise l'item 12, on diminue count.

Cependant dans un inventaire il est possible de modifier un objet, le rendant +ou- unique.
Si j'ai modifié mon épée pour qu'elle fassent des dégâts de feu. J'aimerais pouvoir écrire.
players.items[1] = {id: 30, itemId:13, fireDamage:true'};
De cette manière items[1] pourras être calculer pour devenir l'objet sword avec une nouvelle propriété, fireDamage:true.

Que pensez vous de tout ça?


RE: Stockage relationnel en BDD - Sephi-Chan - 28-08-2012

Pourquoi souhaites-tu grouper les objets ?
Si on ne groupe pas, on n'a pas de problème.
Ça me paraît donc être la question la plus fondamentale.


RE: Stockage relationnel en BDD - Shidame - 28-08-2012

Il faut qu'un objet instancié ai son propre identifiant sinon.

ItemTypes qui contient les type d'objet, avec par exemple Potion de mana (id: 34)
Et par exemple une table qui stock l'objet appartenant au joueur, Items (player_id: 1, item_type_id: 34, other infos...)


RE: Stockage relationnel en BDD - Angelblade - 28-08-2012

Sephi:

Ce que je veux c'est que si je modifie la puissance d'attaque d'une épée, toutes les épées dérivées de celles-ci voient leur puissance d'attaque modifiée.

Je ne souhaite pas grouper les objets, je parle de count:2 car ça permettrais d'éviter d'avoir des ids en doublons. Mais je dis ensuite que je veux pas faire comme ça parce que les objets peuvent différés de l'objet de base.

Shidame:

Si j'ai bien compris tu parler de créer une table qui se rempli au fur et à mesure des combinaisons possibles de chaque objet?


RE: Stockage relationnel en BDD - Sephi-Chan - 28-08-2012

Ce que je fais dans de tels cas, c'est que j'ai une table pour les types d'objets (à la manière des classes en POO), et une table pour les objets (à la manière d'instances).


Prenons un exemple concret.

Disons que dans mon jeu, il existe un type d'objet "Mur glaciaire de la Couronne de glace" (qui a pour id 42 dans la table item_types). Cette table contient toutes les informations de la version générique de l'objet.

Si mon personnage "Sephi-Chan" (d'id 69 dans la table characters) l'obtient, on va créer une entrée dans la table items qui associera mon personnage (via la colonne character_id) à mon type d'objet (via la colonne item_type_id). On stock également toutes les choses spécifique à ce bouclier dans cette table (son état, les enchantements spéciaux, les gemmes, etc.).

Tu comprends ?


RE: Stockage relationnel en BDD - Angelblade - 28-08-2012

Oui je vois merci pour l'explication.
En fait, mon interrogation portait plus sur le moyen de lier l'objet de base, l'objet instancié et le propriétaire.
Et je me rend compte qu'il faut un identifiant représentant la relation entre les trois, y'a pas le choix.