我有一个包含两个表的数据库——我们称它们为 Foo 和 Bar。每个 foo 可能与任意数量的 bar 相关,并且每个 bar 可能与任意数量的 foo 相关。我希望能够通过一个查询来检索与某个 bar 关联的 foo,以及与某个 foo 关联的 bar。
我的问题是,记录这些关系的最佳方式是什么?我应该有一个单独的表来记录每个关系(例如两列,foo 和 bar)吗?foo 表是否应该有一个栏列表的列,反之亦然?还有另一个我忽略的选择吗?
我有一个包含两个表的数据库——我们称它们为 Foo 和 Bar。每个 foo 可能与任意数量的 bar 相关,并且每个 bar 可能与任意数量的 foo 相关。我希望能够通过一个查询来检索与某个 bar 关联的 foo,以及与某个 foo 关联的 bar。
我的问题是,记录这些关系的最佳方式是什么?我应该有一个单独的表来记录每个关系(例如两列,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
所以,在上面,可能有很多 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>)
(没有找到这个问题的任何确切的欺骗,但以下问题扩展了该主题。)
这确实是多对多的关系。除了迈克尔的回答之外,我还想提供以下内容作为附加资源。我已经看到太多糟糕的数据库实现没有提出这个问题(不仅仅是你,还有其他可能在未来看到这个的人)