9

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

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

或者

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

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

4

5 回答 5

24

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

示例假设我们使用第一个示例

Author
AuthorID

Book
BookID
AuthorID

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

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


让我们以 Stackoverflow 为例,从一对多关系开始,以多对多关系结束:

Authors
Joel
Jeff

Books
Stackoverflow Joel

可怜的杰夫,上例中的 stackoverflow 并没有归功于他……所以我们需要解决这个问题:

Author
Joel
Jeff

Books
Stackoverflow

AuthorBooks
Stackoverflow Jeff
Stackoverflow Joel

现在大家都很开心...

于 2012-04-13T17:22:09.700 回答
5

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

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

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

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

祝你有美好的一天。

于 2012-04-13T17:29:38.153 回答
4

一对多就是两张表。

第二个是多对多。

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
于 2012-04-13T17:23:39.137 回答
1

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

于 2012-04-13T17:20:15.740 回答
0

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

关联

于 2013-11-30T18:39:09.233 回答