两个表之间的一对多关系应该用两个或三个表实现吗? 例如,我们应该:
author(id,otherAttributtes)
books(id,authorid,otherAttributes)
或
author(id,otherAttributtes)
books(id,otherAttributes)
authorConnectsBooks(authorid,booksid)
我更喜欢第一种方法,但我已经看过很多次第二种和更复杂的应用程序。第一种方法是否有任何缺点,或者只是个人的方式?
答案 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或交叉引用表的额外表,因为大多数数据库管理系统只支持一对多关系,所以有必要通过第三个联结表手动实现这种关系。联结表的主键通常使用其连接的表的主键形成。 这是一个维基页面,解释了您提出的完全相同的示例: