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

use*_*666 8 database database-design

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

author(id,otherAttributtes)
books(id,authorid,otherAttributes)
Run Code Online (Sandbox Code Playgroud)

要么

 author(id,otherAttributtes)
    books(id,otherAttributes)
    authorConnectsBooks(authorid,booksid)
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一种方法,但我已经看过很多次第二种和更复杂的应用程序.第一种方法有任何缺点,或者只是个人的方式可以遵循?

Jon*_*onH 23

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

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

Author
AuthorID

Book
BookID
AuthorID
Run Code Online (Sandbox Code Playgroud)

你如何表示Jane和Jon都写了"Stackoverflow for fun"这本书?在这个关系表中你不能,你已经表达过一个作者可以写很多书.所以,无论是Jane写的还是Jon写的.如果只有其中一个人写了书,你可以使用这种关系类型.但是,如果你想表明两者都写这本书你需要多对多的关系.

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


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

Authors
Joel
Jeff

Books
Stackoverflow Joel
Run Code Online (Sandbox Code Playgroud)

可怜的杰夫,他从上面的例子中得不到stackoverflow ...所以我们需要解决这个问题:

Author
Joel
Jeff

Books
Stackoverflow

AuthorBooks
Stackoverflow Jeff
Stackoverflow Joel
Run Code Online (Sandbox Code Playgroud)

现在每个人都很开心......


Ton*_*son 5

一对多是两张桌子.

第二个是多对多.

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
Run Code Online (Sandbox Code Playgroud)


Ces*_*iel 5

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

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

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

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

祝你有美好的一天。