JeuWeb - Crée ton jeu par navigateur
Info en double ? C'est mal ? - 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 : Info en double ? C'est mal ? (/showthread.php?tid=783)



Info en double ? C'est mal ? - Seren - 10-02-2007

J'explique mon dilemne.

J'ai une table 'Personnage'.
J'ai une table 'Objet'.

Solution 1 : (doublon)
La table 'Personnage' contient un champ 'Poids Porté', qui désigne la somme des objets portés par le personnage.
La table Objet avec la description des objets : propriétaire, poids, etc...

ça veut dire qu'à l'initialisation, je calcule une seule fois le Poids total pour mon personnage et je le garde dans ma table Personnage.

Problème: l'information est en double dans la table et à chaque fois qu'il y aura une modif sur les objets de mon perso, genre "je pose un objet", je dois faire deux UPDATE.
1. Update la table objet pour dire qu'il est par terre.
2. Update le champ poids de la table Perso pour enlever ce que je viens de poser.


Solution 2Sadclean?)
Perso n'a plus l'info du poids total portée.

Résultat: A chaque fois que je veux tester si mon personnage est surchargé, je dois faire un
SELECT SUM(poids) WHERE FROM Objet, Perso WHERE Perso.id = Objet.id.

Par contre la mise à jour est plus simple.

Après reflexion il me semble que la solution 2 est plus propre.

Mais je voulais savoir si y a certain cas ou vous gardez une information en double dans le meme genre pour vous évitez trop de calcul inutile ?


RE: Info en double ? C'est mal ? - gtsoul - 10-02-2007

Ca m'arrive, mais c'est pour des exemples plus complexes.
Ici le poids porté peut se calculer à la volée (c'est pas lourd comme requete), d'autant plus que les changements de poids sont fréquents (drop/ramassage d'objets) ; donc je pense que c'est une mauvaise idée.

Pour ma part, je pense que dupliquer des infos dans ta base doit répondre aux contraintes suivantes :
_ le calcul est long (moults jointures)
_ le résultat ne change qu'occasionnellement (au moins ttes les 24h)
_ la requete est très compliquée (requetes imbriquées et relation récursive)
Sinon tu t'allèges sur une requête mais tu te retrouves à faire toutes les maj en double.

Par exemple, j'ai une table perso : id_perso | race_perso
et une table relation_perso : id_perso1 | id_perso2 | relation, qui mesure le niveau d'amitié entre 2 joueurs
Je veux calculer un indice de communautarisme, qui serait la somme de toutes les relations entre une race et une autr.
Donc j'ai crée la table relation_races : id_race1 | id_race2 | relation
Sauf que là pas moyen de trouver la bonne requête. Donc j'ai modifié la table relation_perso : id_perso1 | id_perso2 | relation | id_race1 | id_race2, pour pouvoir calculé la somme plue rapidement.
Les infos race et perso sont en double mais ne changent jamais, donc c'est moyennement grave.


RE: Info en double ? C'est mal ? - Plume - 12-02-2007

En bref, pour ton cas, tu avais bien vu, la deuxième solution est à préférer.
Préfère éviter les doublons tant que c'est possible.