数据库中的一对多关系-设计理念
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
【讨论】:
以上是关于数据库中的一对多关系-设计理念的主要内容,如果未能解决你的问题,请参考以下文章