J'ai une base de données avec deux tables - appelons-les Foo et Bar. Chaque foo peut être lié à n'importe quel nombre de barres, et chaque barre peut être liée à un nombre quelconque de foos. Je veux être capable de récupérer, avec une requête, les foos associés à une certaine barre, et les barres qui sont associées à un certain truc. Ma question est la suivante: quelle est la meilleure façon d'enregistrer ces relations? Devrais-je avoir une table distincte avec des enregistrements de chaque relation (par exemple, deux colonnes, foo et bar)? La table foo devrait-elle avoir une colonne pour une liste de barres, et vice versa? Y a-t-il une autre option que je néglige?Théorie de la base de données - relation entre deux tables
Répondre
Cela s'appelle une relation plusieurs-à-plusieurs. La solution "standard" consiste à configurer une troisième table, avec la clé primaire de chaque table dans chaque ligne où il y a une relation.
La troisième table est appelée une table de jonction. "Table de jonction" de Wikipedia: http://en.wikipedia.org/wiki/Junction_table
À titre d'exemple:
Foo
UID
Col1
Col2
Bar
UID
Col1
Col2
Foo_Bar
UID
Foo_UID
Bar_UID
Ainsi, dans ce qui précède, il pourrait y avoir beaucoup de baby-foot et de nombreux bars. Chaque foo qui se rapporte à une barre et chaque barre qui se rapporte à un foo existerait dans la table Foo_Bar. Pour obtenir tous les foos qui se rapportent à une barre donnée, vous pouvez utiliser l'instruction SQL suivante:
select *
from foo
where uid in (
select foo_uid
from foo_bar
where bar_uid=<some bar uid>)
(. N'a pas trouvé de dupes exactes de cette question, mais les questions suivantes se dilatent sur le sujet)
Many to many table design question
Many to Many Relation Design - Intersection Table Design
Il est en effet un grand nombre à plusieurs navires de relation. En plus de la réponse de Michael, je voulais fournir ce qui suit en tant que ressource supplémentaire. Je l'ai vu trop de mise en œuvre de la base de données pauvres de ne pas soulever cette question (et pas seulement pour vous, mais d'autres qui pourraient voir à l'avenir)
- 1. sur quelle base la relation entre les tables sont définies
- 2. relation entre deux instances de modèle
- 3. Copie d'une relation 1-à-plusieurs entre deux tables vers deux autres tables (SQL 2005)
- 4. Synchroniser en continu des tables entre deux bases de données
- 5. Comment configurer la relation de base de données MySQL
- 6. Comparaison de données entre deux tables MySQL avec PHP
- 7. Comparaison de deux tables de base de données
- 8. Charger deux tables liées dans une base de données Oracle
- 9. Relations entre la théorie de la complexité et l'ingénierie logicielle?
- 10. Tables de base de données relationnelles
- 11. Copier la base de données de données de base entre deux iphone
- 12. Comment synchroniser deux tables de base de données entre elles dans mysql PHP
- 13. Nhibernate ICreteria relation entre les tables
- 14. joindre entre deux tables avec linq aux ensembles de données
- 15. Théorie à propos de la méthode Object Relation Mappinglogy
- 16. Comment visualiser la relation des tables dans une base de données Oracle
- 17. Conception de base de données - question de relation de table
- 18. Comment stocker la 'relation' entre deux enregistrements de coredata?
- 19. Relation entre deux modèles d'héritage monotables
- 20. différences entre deux instantanés de base de données SQL Server
- 21. Contrôle de cohérence Mysql entre deux tables
- 22. Problème de conception de la base de données: une table intermédiaire entre deux tables peut aboutir à trop de résultats
- 23. Newbie rails base de données relation question
- 24. relation plusieurs-à-plusieurs dans la conception de base de données
- 25. Relation de tables dans Cakephp
- 26. Association de deux tables de base de données ayant une relation ForeignKey dans models.py dans les modèles django
- 27. Comment ajouter une relation entre deux tables dans Mysql en utilisant le centre de contrôle Mysql
- 28. Null Relation de données de base
- 29. DataRelation entre deux tables de données - ne peut pas lier les données à une zone de liste (C# .NET 3.5)
- 30. Base de données SQL Server Synchronisation entre deux serveurs
1) Dans la terminologie Relational, si elle contient ** seulement ** les PK des parents, c'est une table ** Associative **, car elle résout la relation many-to-many; s'il contient d'autres données, c'est une "table" ordinaire. Aucune idée de ce que les wikis vont appeler cette semaine. 2) A moins de vouloir dupliquer des lignes, le PK est '(Foo_UID, Bar_UID)'. 3) Le 'Foo-Bar.UID' est redondant à 100%, une colonne et un index supplémentaires; cela ne sert à rien; il peut être retiré. – PerformanceDBA