我有一个带两个表的数据库 - 我们称它们为Foo和Bar。每个foo可能与任意数量的酒吧有关,每个酒吧可能与任何数量的foos有关。我希望能够通过一个查询来检索与特定栏关联的foos以及与特定foo关联的栏。数据库原理 - 两个表之间的关系
我的问题是,记录这些关系的最佳方式是什么?我是否应该有一个单独的表格以及每个关系的记录(例如,两列,foo和bar)? foo表是否应该有一列表格作为栏的列表,反之亦然?是否有另一个我忽略的选项?
我有一个带两个表的数据库 - 我们称它们为Foo和Bar。每个foo可能与任意数量的酒吧有关,每个酒吧可能与任何数量的foos有关。我希望能够通过一个查询来检索与特定栏关联的foos以及与特定foo关联的栏。数据库原理 - 两个表之间的关系
我的问题是,记录这些关系的最佳方式是什么?我是否应该有一个单独的表格以及每个关系的记录(例如,两列,foo和bar)? foo表是否应该有一列表格作为栏的列表,反之亦然?是否有另一个我忽略的选项?
这就是所谓的多对多关系。 “标准”解决方案是设置第三个表格,每行中每个表格的主键都有关系。
第三个表称为联结表。 “接线表”维基百科:http://en.wikipedia.org/wiki/Junction_table
举个例子:
Foo
UID
Col1
Col2
Bar
UID
Col1
Col2
Foo_Bar
UID
Foo_UID
Bar_UID
所以,在上面的,可能有许多的Foo和许多酒吧。与Foo相关的每个foo和与foo相关的每个bar都将存在于Foo_Bar表中。要获得所有与给定栏的Foo,你可以使用下面的SQL:
select *
from foo
where uid in (
select foo_uid
from foo_bar
where bar_uid=<some bar uid>)
(没有找到这个问题的任何确切的愚弄,但下列问题的话题展开)
Many to many table design question
Many to Many Relation Design - Intersection Table Design
这确实是一个多对多的关系船。除了Michael的回答之外,我还想提供以下内容作为附加资源。我见过太多的数据库,执行不力,不提这件事(不只是你,但其他谁可能在将来查看此)
1)关系的术语,如果它包含**仅**父母的PK,它是**关联**表,因为它解决了多对多关系;如果它包含其他数据,它是一个普通的“表格”。不知道这周的维基将会怎么称呼它。 2)除非你想重复行,否则PK是'(Foo_UID,Bar_UID)'。 3)'Foo-Bar.UID'是100%冗余的,附加的列和索引;它没有任何用处;它可以被删除。 – PerformanceDBA 2010-12-26 23:04:22