2008-11-18 4 views
3

J'ai une liste de tables, c'est-à-dire, étudiant, enseignant, personnel, service. et ainsi de suite et chacun de ces tableaux ont des commentaires spécifiques à eux. Maintenant, un enregistrement dans une table peut avoir un ou plusieurs commentaires qui montrent qu'il s'agit d'une relation un à plusieurs de n'importe quelle table à table de commentaires. Je ne sais pas quelle est la meilleure façon de relier le tableau des commentaires à chacun d'entre eux. Si je mets la clef étrangère de la table de commentaires à chacune de ces tables, ce sera comme 40-50 champs selon non. des tables. Deuxièmement si j'ajoute la clé étrangère de chacune de ces tables à la table de remarques, ce sera comme répéter la rangée entière juste pour la deuxième clef étrangère de remarques? De même, si je n'utilise qu'un seul champ dans chaque table en tant que commentaires, je stockerai des lignes dans un seul champ de texte. Des suggestions sur la façon de parvenir à une solution efficace?Comment associer une table à plusieurs tables différentes?

Répondre

6

Supposons que vos tables (étudiant, enseignant, personnel, service) ont toutes une clé primaire int nommée Id.

Pour votre tableau des commentaires vous pouvez créer une table.

Id int 
CommentType enum (student, teacher, staff, dept) 
LinkId int 
Comment 

Une ligne de commentaires pourrait ressembler à ceci

1,'Student',347,'text' 
+0

+1 pour la solution classique au problème. En fait, j'ai vu Oracle concevoir des bases de données qui utilisent des constructions similaires pour * toutes * les tables de décodage dans une base de données. Peut être un peu brouillon sur les requêtes, mais simplifie la structure – Cruachan

+0

Merci pour la solution la plus efficace. J'ai pensé à utiliser varchar pour les noms de tables mais je pense que Enum est le meilleur. – hash

+0

Cette conception est appelée associations polymorphes. Je ne le recommande pas car vous ne pouvez pas appliquer l'intégrité référentielle avec une vraie clé étrangère. Il ne respecte pas les règles de normalisation de deux manières différentes. –

0

est un étudiant ou un enseignant ou du personnel non seulement un type de personne ..

si vous avez une personne et une personne peut avoir beaucoup de commentaires? si vous avez une table personscomments avec une relation à cette personne et pourquoi avoir une remarque table..is une remarque non seulement un type de commentaire ..

il est difficile de voir sans plus schéma en profondeur

2

Vous pouvez utiliser des tables intermédiaires "many-to-many". Chaque table de base (étudiant, professeur, etc.) aurait un alter ego stockant une clé étrangère dans la table de base (par exemple, student_id) et une clé étrangère dans la table de commentaires. Vous doublez pratiquement votre nombre de tables, mais vous n'avez pas besoin de modifier les tables existantes et vous obtenez une flexibilité totale.

1

Si vous souhaitez conserver la contrainte de clé étrangère, vous devez disposer d'une table qui gère le mappage pour chaque table qui aura comment-childs. Signification, Commentaire aura une clé primaire, avec une contrainte de clé étrangère pour chaque table qui gère le mappage. Puis, dans la table de mappage, vous avez comment_id et ???? _ id avec une contrainte de clé étrangère dans la table appropriée.

1

Votre table commentaires pourrait se présenter comme suit:

 
CommentID (int) - Primary Key 
TableName (varchar(250)) - Table the comment is related to 
RecordID (int) - the ID of the record in the table referred to 
Comment (text) - the actual comment 

Vous pouvez ajouter des cours champs facultatifs comme un horodatage, qui vous permet de sélectionner des commentaires dans l'ordre dans lequel ils ont été introduits.

Vous pouvez désormais utiliser cette table pour stocker des commentaires pour n'importe quelle table, et vous pouvez les sélectionner en filtrant le nom de la table et l'ID de l'enregistrement.

2

Comme il s'agit d'une relation plusieurs-à-plusieurs, vous souhaiterez peut-être jeter un coup d'œil à l'utilisation d'une table associative.

En utilisant votre exemple, il pourrait ressembler à ceci:

Vos tables qui peuvent ont commentaires:

+----------+------------+ 
| student | student_id | 
+----------+------------+ 
| Steve |   12 | 
| Larry |   57 | 
| Sunshine |   88 | 
+----------+------------+ 

+--------+---------+ 
| dept | dept_id | 
+--------+---------+ 
| Math |  2 | 
| P.E. |  5 | 
| Drama |  12 | 
+--------+---------+ 

Ensuite, vous devez garder une trace des commentaires réels:

+-----------------------+------------+ 
| comment    | comment_id | 
+-----------------------+------------+ 
| I love Math!   |   3 | 
| Larry is my hero... |   5 | 
| Sunshine <3 Me!  |   6 | 
+-----------------------+------------+ 

Maintenant, vous avez besoin d'une association entre ces tables, c'est là que votre table associative entre en jeu. Vous associez maintenant ce que l'étudiant ou le département a quels commentaires, comme ceci:

+------------+------------+ 
| student_id | comment_id | 
+------------+------------+ 
|   57 |   5 | 
|   57 |   6 | 
+------------+------------+ 

+---------+------------+ 
| dept_id | comment_id | 
+---------+------------+ 
|  2 |   3 | 
+---------+------------+ 

Ceci est à la fois efficace et élégant. Donner un coup de feu!

(Et pour vous sauver une autre question peut-être)

Vous pouvez bien utiliser bien sûr que d'une table d'association si vous êtes préoccupé par avoir autant de tables d'association, mais je vous conseille contre elle car elle est pas propre et supprime des possibilités de contrôle d'intégrité référentielle que vous pouvez avoir avec la première solution:

+-----------+------------+---------+ 
| entity_id | comment_id | entity | 
+-----------+------------+---------+ 
|  57 |   5 | student | 
|  57 |   6 | student | 
|   2 |   3 | dept | 
+-----------+------------+---------+ 

(ce qui devrait vous demander d'ajouter une table de consultation pour les entités ... mais nous allons y aller pas)

0

Ma solution de 50 cents: Zoredache est vraiment bonne, mais je décourage l'utilisation d'énumérations; ils ne sont pas très intelligents dans mysql: si vous spécifiez une valeur inconnue, l'erreur est représentée par une chaîne vide - même si une valeur par défaut est spécifiée. Aussi, c'est follement long à ALTER si vous voulez modifier ou ajouter un nouveau type. tinyint non signé devrait être suffisant pour la plupart de vos besoins ...

+0

Cette réponse ne répond pas à la question. C'est en fait une opinion. Vous devriez probablement ajouter ceci comme commentaire. –

Questions connexes