Bonjour,

Je compte remettre à jour un site (de jeu en ligne) que j'ai fait, et en profiter pour repenser la structure de ma BDD, maintenant que je sais plus précisément où je vais. Cependant, il me manque, pour ce faire, des informations de bases :S

1/ J'ai une table regroupant toutes les actions de mon personnage. Ces actions se décomposent en plusieurs familles : combat, magie, recolte, reparation, et artisanat. J'ai donc une clé étrangère qui pointe vers une seconde table, listant ces différents types d'action. Cependant, je ne liste jamais les actions de plusieurs type à la fois (1 requête = 1 type). Je pense donc découper ma table en plusieurs, afin d'avoir moins d'enregistrement dans chaque table.

Ma question : Serait-il mieux de séparer cette table "généraliste" en 1 table par type d'action? J'aurais ainsi une table action_recolte, une action_combat etc etc...


2/ Il m'arrive, sur certaines pages, de faire plusieurs requêtes, pour chercher des infos différentes. J'ai remarqué qu'il serait possible de regrouper le tout en une seule, mais de ce fait, j'aurais plusieurs jointures, et selon les cas, certaines des données ne seront pas utiles.

Exemple classique : lorsque quelqu'un se connecte, je fais une requête à la BDD vérifiant si son login/mdp est correct. Si ce n'est pas le cas, j'affiche un message d'erreur, sinon je fais une seconde requête afin de connaître le nom de son personnage, son niveau d'accès au site (membre, modo, admin etc), les actions qu'il est entrain de réaliser, s'il y en a, sa vie etc etc. Je pourrais très bien retourner ces informations dès ma première requête, mais si la personne ne s'est pas identifiée correctement, j'aurais alourdi ma requête pour rien. Ce n'est qu'un exemple bien sûr, mais ça illustre pas mal l'idée générale

Ma question : En règle général, vaut-il mieux faire une "grosse" requête même si elles contient quelques informations qui ne seront pas forcément utilisées selon le cas, ou découper cette dernière en 2 ou 3 petites?


3/ Dernier point: J'ai une table listant tous les objets de mon jeu. J'hésite à la découper (comme pour mes actions) en plusieurs tables, selon leur type (ressource, arme, armure, objet non confectionnable, etc etc). Il m'arrive ici de faire une requête sur l'ensemble des objets (par exemple pour connaître ce que l'inventaire d'un joueur contient). D'un autre coté, chaque objet a des propriétés particulières (les armes ont un champs signalant les dégâts qu'elles occasionnent, les armures ont une liste de leurs protections etc etc).
Pour le moment, j'ai donc une table "objets" recensant tous les objets du jeu, une seconde listant les types d'objets (type indiqué sur la table précédente bien entendu), puis une table par type d'objet (arme, armure etc).

Ma question : Serait-il plus judicieux de supprimer les tables "objets" et "types", afin de ne laisser que les tables spécifiques aux types d'objets, même si cela, dans le cas du listing de l'inventaire, entrainera une requête sur plusieurs tables au lieu d'une seule? Sachant que dans tous les autres cas par contre, ne listant que les objets d'un type donné, les requêtes en seraient allégées...


4/ Désolé, un oubli : il m'arrive d'avoir souvent besoin d'une donnée, non présente dans la table "principale".

Un exemple simple : j'ai une table "compétences", listant les compétences en indiquant leur nom, les prérequis etc. J'ai une 2e table "personnage_competences" qui liste les compétences qu'un personnage a, et à quel niveau. A chaque fois que je veux lister les compétences d'un joueur, je suis obligé de faire une jointure pour avoir le nom de cette compétence. Je serais tenté de dupliquer le champs "nom_compétence", afin d'en mettre une copie dans ma table "personnage_competences", et de ce fait éviter la jointure à chaque fois que je liste mes compétences. Cependant, j'ai toujours appris qu'il fallait à tout prix éviter de dupliquer une même info à plusieurs endroits, entre autre pour une question de mise à jour...

Ma question : Vaut-il mieux dupliquer une donnée utilisée régulièrement dans 2 tables différentes, ou faire une jointure à chaque fois?

Merci d'avance pour vos réponses!