Bonjour tout le monde !
Je me pose plusieurs questions sur la conception de ma base de données centré sur MySQL 5.
Premiere question :
Est-il possible d'avoir une clé étrangère dans une table pour plusieurs autres tables en fonction de la donnée/ligne ?
Explication :
J'ai les 3 tables suivantes :
VILLE (id_ville, nom_ville, ...., id_région)
REGION (id_region, nom_region, ...., id_pays)
PAYS (id_pays, nom_pays,....)
Enfin, j'ai une autre table qui est par exemple MEMBRE avec un champ "localisation" en clé étrangere (ou clé tout court). Est-il possible que "localisation" puisse être une clé soit de VILLE, soit de REGION, soit de PAYS selon la précision fourni par le membre ? (Et avoir en plus par exemple un champ type_localisation qui indiquerai si la clé correspond à VILLE ou REGION ou PAYS)
Y a-t-il un moyen de modélisé ceci par des contraintes BDD/MySQL ?
Cette méthode est réalisable sans clé étrangere avec des contraintes dans le code PHP qui utilisera la BDD, mais dans ce cas, est-ce déconseillé (car trop de dépendance du code PHP) ?
L'intéret d'une telle methode serait de n'avoir que 2 champs(types + id) au lieu de n champs. Sachant également qu'à partir d'un ID on peut en connaitre les autres (Si on connait la VILLE, on connait sa REGION et son PAYS, Si on connait la REGION, on connait le PAYS mais pas la ville)
Est-il preferable d'avoir dans la table MEMBRE, un id pour chaque table de localisation ou de suivre cette méthode (ou une autre) ?
Ce cas là, je le vois apparaitre également dans d'autres cas dans ce que je veux concevoir. Ici, le gain serait assez faible (il n'y a au final qu'une colonne de gagner mais on pourrait très bien ajouté une Table ADRESSE, ZONE(s) voir peut-etre plus).
Deuxième question :
Est-il préférable de centraliser plusieurs informations similaires dans une même table (avec une indexation) ou de séparer en créant bien plus de relation TABLE-TABLE ?
Je me pose cette question pour le cas suivants :
Je souhaite stocker divers messages (ex: dans une table MESSAGE) tous composés d'un texte puis d'un titre. Tous ces messages auront les mêmes relations avec les autres tables (ex: AUTEUR, LANGUES, TRADUCTION....)
Cependant, chaque message peut-etre de type différent : guide, question (faq), expérience, astuces....dont chaque aura des attributs totalements différents.
Dans ce cas, faut-il centraliser tous les "MESSAGES" et les reliés à un type (second cas de la premiere question, clé + type pour ciblé vers la bonne table) ou mettre les (même) informations du messages (titre, texte, date..) dans chaque type d'écrit ? Dans le premier cas, tous les messages étant centralisé dans une même table, à long terme, la recherche ne sera-t-elle pas trop "longue" (par exemple si il y a des centaines de guides, des centaines d'astuces, des milliers de questions,...) ? Dans le second cas, il faut recréer autant de fois les relations assigné à MESSAGE qu'il y a de table correspondant à un type (guides, astuces, questions...).
Troisieme question :
Est-ce aisé de faire une relation 1-1 dans le cas suivant ? :
Séparer une table MEMBRE en deux avec d'un coté les champs obligatoires (pseudo, pass, mail, date...) et d'un autre les champs facultatifs (ou facultatifs dans la plupart des cas) (nom, prenom, adresse, telephone....).
Je pense que cette méthode optimise le stockage. (sur 1000 membres, je pense que seulement 200 environs auront rempli une information facultative, non ?)
Merci beaucoup pour vos réponses.
Bonne lecture !
et n'hésitez pas à me demander des détails ou de mieux expliquer si besoin
A+
Cbil
Partager