Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 数据库理论-两个表之间的关系_Database Design_Many To Many_Relational Database - Fatal编程技术网

Database design 数据库理论-两个表之间的关系

Database design 数据库理论-两个表之间的关系,database-design,many-to-many,relational-database,Database Design,Many To Many,Relational Database,我有一个包含两个表的数据库——我们称它们为Foo和Bar。每个foo可能与任意数量的条相关,每个条可能与任意数量的foo相关。我希望能够通过一个查询检索与特定条关联的foo,以及与特定foo关联的条 我的问题是,记录这些关系的最佳方式是什么?我是否应该有一个单独的表,其中包含每个关系的记录,例如两列,foo和bar?foo表是否应该有一列用于显示条列表,反之亦然?还有我忽略的另一种选择吗?称为多对多关系。标准的解决方案是设置第三个表,在有关系的每一行中的每个表中都有主键 第三个表称为连接表。维基

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


我的问题是,记录这些关系的最佳方式是什么?我是否应该有一个单独的表,其中包含每个关系的记录,例如两列,foo和bar?foo表是否应该有一列用于显示条列表,反之亦然?还有我忽略的另一种选择吗?

称为多对多关系。标准的解决方案是设置第三个表,在有关系的每一行中的每个表中都有主键

第三个表称为连接表。维基百科中的连接表:

例如:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID
因此,在上面,可能会有很多美食和酒吧。与某个条相关的每个foo和与某个foo相关的每个条都将存在于foo_bar表中。要获取与给定条相关的所有foo,可以使用以下SQL:

select *
from foo
where uid in (
    select foo_uid
    from foo_bar
    where bar_uid=<some bar uid>)
没有发现这个问题的任何确切的重复,但是下面的问题扩展了这个主题


这确实是一种多对多的关系。除了Michael的回答之外,我还想提供以下内容作为额外资源。我见过太多糟糕的数据库实现,不可能不为您,也不为将来可能会看到这一点的其他人提出来


1在关系术语中,如果它只包含父级的PKs,则它是一个关联表,因为它解析多对多关系;如果它包含其他数据,则为普通表。不知道维基本周会怎么称呼它。2除非您想要重复的行,否则主键是Foo\u UID,Bar\u UID。3 Foo-Bar.UID是100%冗余的,是一个额外的列和索引;它毫无用处;它可以被移除。