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

时间:2012-04-13 17:16:46

标签: database database-design

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

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

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

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

5 个答案:

答案 0 :(得分:23)

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

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

Author
AuthorID

Book
BookID
AuthorID

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

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

<小时/> 让我们以Stackoverflow为例,从一对多关系开始,以多对多关系结束:

Authors
Joel
Jeff

Books
Stackoverflow Joel

可怜的Jeff,他不赞成上面例子中的stackoverflow ...所以我们需要解决这个问题:

Author
Joel
Jeff

Books
Stackoverflow

AuthorBooks
Stackoverflow Jeff
Stackoverflow Joel

现在大家都很开心......

答案 1 :(得分: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

答案 2 :(得分:5)

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

但是你在你的例子中(作者和书籍之间)建议的关系不是一对多的,是多对多的。

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

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

祝你有个美好的一天。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

LINK