数据库中的一对多关系-设计理念

Posted

技术标签:

【中文标题】数据库中的一对多关系-设计理念【英文标题】:one to many relationship in database - design concept 【发布时间】:2012-04-26 01:59:05 【问题描述】:

两个表之间的一对多关系应该用两个或三个表来实现? 例如我们应该有:

author(id,otherAttributtes)
books(id,authorid,otherAttributes)

 author(id,otherAttributtes)
    books(id,otherAttributes)
    authorConnectsBooks(authorid,booksid)

我更喜欢第一种方法,但我已经多次看到第二种方法和更复杂的应用程序。第一种方法有什么缺点吗,还是看个人情况?

【问题讨论】:

感谢您的回答!! (这个例子是随机的,我只是想展示一对多的关系) How to implement one-to-one, one-to-many and many-to-many relationships while designing tables?的可能重复 【参考方案1】:

第一个示例显示一对多关系,而第二个示例显示多对多关系。

假设我们使用第一个示例

Author
AuthorID

Book
BookID
AuthorID

您如何表示 Jane 和 Jon 都写了《*** for fun》这本书?在这个关系表中你不能,你已经表示一个作者可以写很多本书。所以要么是简写的,要么是乔恩写的。如果只有其中一个人写了书,你就可以使用这种关系类型。然而,如果你想表明这本书是他们俩写的,你需要一个多对多的关系。

现在使用 Jane 和 Jon 的相同类比,您可以使用您的第二个示例代表这本书的两位作者 - 多对多关系。


让我们以 *** 为例,从一对多关系开始,以多对多关系结束:
Authors
Joel
Jeff

Books
*** Joel

可怜的 Jeff,上例中的 *** 并没有归功于他...所以我们需要解决这个问题:

Author
Joel
Jeff

Books
***

AuthorBooks
*** Jeff
*** Joel

现在大家都很开心……

【讨论】:

我们将不得不删除 Jeff 是所有者的记录,因为他不再是 :-(【参考方案2】:

应该使用 2 个表来实现一对多关系。

但是您在示例中提出的关系(作者和书籍之间)不是一对多,而是多对多。

“一个作者可以写很多本书,而一本书可以由一个或多个作者写。”

多对多关系应该用3个表来实现。

祝你有美好的一天。

【讨论】:

【参考方案3】:

一对多就是两张表。

第二个是多对多。

Authors
1 Larry Niven
2 Jerry Pournelle

Books
1 Integral Trees
2 King David's Spaceship
3 The Mote in God's eye

AuthorsBooks
1 1
2 2
1 3
2 3

【讨论】:

【参考方案4】:

如果关系实际上是一对多的,则不需要链接表(在您的示例中为authorConnectsBooks)。但是,在您的示例中,您没有一对多的关系,因为一位作者可以写多本书,而一本书可以由许多作者写。在您的示例中,您实际上具有多对多关系。如果您实际上有一个多对多关系,那么您确实需要一个链接表(在您的示例中为authorConnectsBooks)。

【讨论】:

【参考方案5】:

正如大家所说,第一个是一对多的关系,你不需要额外的表。只有两张桌子应该工作。但是在第二种情况下,由于它是多对多关系,您需要添加一个称为 Junction 或交叉引用表的额外表,因为大多数数据库管理系统只支持一对多关系,这是必要的通过第三个联结表手动实现这种关系。联结表的主键通常使用它连接的表的主键形成。 这是一个 wiki 页面,它解释了您询问的完全相同的示例:

LINK

【讨论】:

以上是关于数据库中的一对多关系-设计理念的主要内容,如果未能解决你的问题,请参考以下文章

数据库设计中的13个技巧

数据库设计中的14个技巧

数据库设计中的14个技巧

数据库表中一对多关系怎么设计?

数据库设计(一对一对多多对多)

如何使用PowerDesigner软件进行数据库设计(一对多关系)