2012-04-13 75 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