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
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'
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
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.
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.
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.
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)
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 ...
Cette réponse ne répond pas à la question. C'est en fait une opinion. Vous devriez probablement ajouter ceci comme commentaire. –
- 1. [NHibernate] Comment associer plusieurs types d'objets à une table?
- 2. se joindre à une table plusieurs fois à d'autres tables
- 3. Sélection de plusieurs valeurs différentes tables
- 4. Nav table - besoin d'informations à partir de deux tables différentes
- 5. Performance MySQL: Table unique ou plusieurs tables
- 6. Comportement OO pour une base de données ER (relation un-à-plusieurs pour plusieurs tables)
- 7. Comment partager une table un-à-plusieurs
- 8. mise à jour d'une table en joignant plusieurs tables
- 9. Liaison Linq à plusieurs tables
- 10. comment sélectionner une table particulière à partir d'une procédure stockée qui renvoie plusieurs tables?
- 11. C# .net ListView - Récupère des informations différentes de différentes tables
- 12. Ajout d'éléments à plusieurs tables avec linq à sql
- 13. Suppression d'un élément de plusieurs à plusieurs tables de référence?
- 14. SQL SELECT à partir de plusieurs tables
- 15. Comment supprimer en cascade sur la table plusieurs à plusieurs
- 16. HABTM 2 tables 2 relations différentes
- 17. Comment puis-je diviser une table mysql en plusieurs tables et interroger l'arrea correct?
- 18. Comment synchroniser deux tables MySQL ayant des structures différentes?
- 19. requête efficace pour plusieurs à plusieurs table
- 20. Comment faire correspondre plusieurs tables avec le même schéma à une classe
- 21. données Interrogation de différentes tables
- 22. MySql: Sélection à partir de plusieurs tables
- 23. NHibernate - mappe la même entité à différentes tables dans la même base de données
- 24. WPF lier plusieurs contrôles à différentes datacontexts
- 25. Comment modéliser des tables avec des clés étrangères à partir de plusieurs autres tables
- 26. Comment mapper plusieurs classes à une table via NHibernate?
- 27. Comment modéliser une relation plusieurs à plusieurs?
- 28. Peut-on associer une gamme à Scala?
- 29. Comment joindre (fusionner?) Plusieurs tables?
- 30. MySQL: Sélectionnez Distinct à partir de 2 tables différentes?
+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
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
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. –