2012-04-13 76 views
8

两个表之间的一对多关系应该用两个还是三个表来实现? 例如,我们应该有:数据库中的一对多关系 - 设计概念

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

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

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

+0

感谢您的答案! (这个例子是随机的,我只是想展示一对多的关系) – user666 2012-04-13 17:33:21

回答

22

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

例如,假设我们使用的第一个例子

Author 
AuthorID 

Book 
BookID 
AuthorID 

你会如何表现,无论简和乔恩写的书“#1为了好玩”?在这张关系表中,你不能,你已经表达了一个作者可以写很多书。所以无论是简写的还是Jon写的。如果他们中只有一个写了书,你可以使用这种关系类型。然而,如果你想表明这两本书都写了这本书,你需要一个多对多的关系。

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


允许使用作为#1开始一个一对多的关系,并与一个多对多的关系结束的例子:

Authors 
Joel 
Jeff 

Books 
Stackoverflow Joel 

可怜的杰夫,他并没有从上面的例子计算器记......所以我们要解决这个问题:

Author 
Joel 
Jeff 

Books 
Stackoverflow 

AuthorBooks 
Stackoverflow Jeff 
Stackoverflow Joel 

现在大家的幸福......

+0

我们将不得不删除杰夫是所有者的记录,因为他不再是:-( – JonH 2016-08-15 14:43:05

1

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

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 
4

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

但是,您在示例中(作者和图书之间)建议的关系并非一对多,而是多对多。

“作者可以编写多本书,并且一本书可以由一个或多个作者编写。”

而且应该用3个表来实现多对多的关系。

祝您有美好的一天。

0

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

LINK