3

我有一个包含两个表的数据库——我们称它们为 Foo 和 Bar。每个 foo 可能与任意数量的 bar 相关,并且每个 bar 可能与任意数量的 foo 相关。我希望能够通过一个查询来检索与某个 bar 关联的 foo,以及与某个 foo 关联的 bar。

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

4

2 回答 2

11

这就是所谓的多对多关系。“标准”解决方案是设置第三张表,其中每个表的主键位于存在关系的每一行中。

第三个表称为联结表。来自维基百科的“连接表”:http ://en.wikipedia.org/wiki/Junction_table

举个例子:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

所以,在上面,可能有很多 foos 和很多 bar。与 bar 相关的每个 foo 以及与 foo 相关的每个 bar 都将存在于 Foo_Bar 表中。要获取与给定 bar 相关的所有 foo,您可以使用以下 SQL:

select *
from foo
where uid in (
    select foo_uid
    from foo_bar
    where bar_uid=<some bar uid>)

(没有找到这个问题的任何确切的欺骗,但以下问题扩展了该主题。)

多对多表设计问题
多对多关系设计 - 交叉表设计

于 2010-03-16T20:08:23.550 回答
1

这确实是多对多的关系。除了迈克尔的回答之外,我还想提供以下内容作为附加资源。我已经看到太多糟糕的数据库实现没有提出这个问题(不仅仅是你,还有其他可能在未来看到这个的人)

于 2010-03-16T20:14:36.947 回答