为什么没有多对多关系?

The*_*111 32 sql database

我是第一次学习数据库和SQL.在我正在阅读的文章(Oracle 11g:Joan Casteel的SQL)中,它说"关系数据库中不存在多对多关系".我明白我们要避免它们,并且我理解如何创建一个桥接实体来消除它们,但我试图完全理解"不能存在"的说法.

实际上,实际上不可能有代表多对多的关系吗?

或者它只是非常低效,因为它会导致大量的数据重复?

在我看来,后者就是这种情况,桥接实体最大限度地减少了重复数据.但也许我错过了什么?我没有找到一个具体的理由(或者更好的例子),它解释了为什么要避免多对多关系,无论是在文本中还是在我搜索过的任何其他地方.我一整天都在搜索,只是重复找到相同的信息:"不要这样做,而是使用桥接实体." 但我想问为什么.:-)

谢谢!

Joe*_*lli 47

想想一个像作者和书籍之间的简单关系.作者可以写很多书.一本书可能有很多作者.现在,如果没有桥接表来解决多对多关系,替代方案会是什么?您必须向Books表添加多个Author_ID列,每个作者一个.但是你添加了多少?2?3?10?无论你选择多少,你可能会得到很多稀疏行,其中许多Author_ID值都是NULL,你很可能遇到需要"只需要一个"的情况.那么你要么经常修改架构以试图适应,要么你施加一些人为限制("没有书可以有超过3位作者")来迫使事情适应.

  • @Johnson:我觉得我在硕士论文上得到的评论少了!:-)但我认为你现在正在得到正确的理解. (3认同)
  • 谢谢回复。但是,为什么需要多个Author_ID列?为什么不能创建多个行,每个Author_ID都创建一个行?我想回答我自己的问题...在那一刻,您在书本表中没有合适的PK候选人,因为Book_ID在有多位作者的情况下会重复出现(除非您将PK视为Book_ID和Author_ID的组合我觉得有点笨拙)。不过,“笨拙”与不可能有所不同。无论如何,我想我已经开始理解。让我知道这是否有意义:(续下页) (2认同)
  • (接上) MM 示例: Book >-< Author :在 Book 表中,你不能重复 Author_ID,在 Author 表中,你不能重复 Book_ID……因为我上面概述的“规则” 。因此,如果不创建桥接表链接,就无法链接表。然而,违反这条规则的结果是什么?让我们假装我们这样做了。(下续) (2认同)

JDP*_*ham 7

通常(双关语)您会使用链接表来建立多对多

就像 Joe Stefanelli 所描述的那样,假设您有作者和书籍

SELECT * from Author
SELECT * from Books
Run Code Online (Sandbox Code Playgroud)

您将创建一个JOIN名为 AuthorBooks的表

然后,

SELECT * 
FROM Author a 
JOIN AuthorBooks ab
  on a.AuthorId = ab.AuthorId 
JOIN Books b
  on ab.BookId = b.BookId
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Mik*_*ien 5

在关系数据库中无法创建涉及两个表的真正的多对多关系.我相信当他们说它不存在时,他们就是这么说的.为了实现多对多,你需要一个基本上有3个字段的中间表,一个ID,一个附加到第一个表的id和一个附加到第二个表的id.

不想要多对多关系的原因就像你说他们的效率非常低效并且管理与关系每一方相关的所有记录都很难,例如,如果你删除一方的记录会发生什么关系表中的记录和另一方的表格?至少在我看来,级联删除是一个滑坡.

  • 不要求该中间表中存在第三个"ID"字段.您可以从其他两个表的ID中简单地创建一个复合键. (2认同)

Tho*_*mas 5

它说“多对多关系不能存在于关系数据库中”。

我怀疑作者只是有争议。从技术上讲,在 SQL 语言中,没有办法显式声明 MM 关系。它是向表声明多个 1-M 关系的紧急结果。但是,这是实现MM关系结果的常用方法,并且在关系数据库管理系统上设计的数据库中绝对经常使用。

我还没有找到一个具体的原因(或者更好的例子)来解释为什么要避免多对多关系,

它们应该用在适合使用的地方,这是一种更准确的说法。有时,例如 Joe Stafanelli 给出的书籍和作者示例,任何其他解决方案都将效率低下并引入其他数据完整性问题。但是,MM 关系使用起来更复杂。它们增加了 GUI 设计人员的更多工作。因此,它们应该只在有意义的地方使用。如果您非常确信一个实体不应与多个其他实体关联,那么一定要将其限制为 1-M。例如,如果您要跟踪货件的状态,则每个货件在任何给定时间只能有一个状态。允许货物具有多种状态会使设计过于复杂并且没有逻辑意义。