2010-03-16 111 views
3

我有一个带两个表的数据库 - 我们称它们为Foo和Bar。每个foo可能与任意数量的酒吧有关,每个酒吧可能与任何数量的foos有关。我希望能够通过一个查询来检索与特定栏关联的foos以及与特定foo关联的栏。数据库原理 - 两个表之间的关系

我的问题是,记录这些关系的最佳方式是什么?我是否应该有一个单独的表格以及每个关系的记录(例如,两列,foo和bar)? foo表是否应该有一列表格作为栏的列表,反之亦然?是否有另一个我忽略的选项?

回答

11

这就是所谓的多对多关系。 “标准”解决方案是设置第三个表格,每行中每个表格的主键都有关系。

第三个表称为联结表。 “接线表”维基百科: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

+0

1)关系的术语,如果它包含**仅**父母的PK,它是**关联**表,因为它解决了多对多关系;如果它包含其他数据,它是一个普通的“表格”。不知道这周的维基将会怎么称呼它。 2)除非你想重复行,否则PK是'(Foo_UID,Bar_UID)'。 3)'Foo-Bar.UID'是100%冗余的,附加的列和索引;它没有任何用处;它可以被删除。 – PerformanceDBA 2010-12-26 23:04:22