2016-07-22 137 views
1
CREATE TABLE Books(
     BookID SMALLINT NOT NULL PRIMARY KEY, 
     BookTitle VARCHAR(60) NOT NULL, 
     Copyright YEAR NOT NULL 
    ) 




CREATE TABLE Authors(
     AuthID SMALLINT NOT NULL PRIMARY KEY, 
     AuthFN VARCHAR(20), 
     AuthMN VARCHAR(20), 
     AuthLN VARCHAR(20) 
    ) 


CREATE TABLE AuthorBook(
     AuthID SMALLINT NOT NULL, 
     BookID SMALLINT NOT NULL, 
     PRIMARY KEY (AuthID, BookID), 
     FOREIGN KEY (AuthID) REFERENCES Authors (AuthID), 
     FOREIGN KEY (BookID) REFERENCES Books (BookID) 
    ) 

這裏結表authorbook 爲什麼主鍵(AUTHORID,BOOKID)用於爲什麼sql中的多對多關係表實現外鍵爲主鍵?

爲什麼不能有一個單獨的表ID,並使其主鍵?

+0

你可以這樣做。當更廣泛的數據類型存在時,比如varchars,縮放比較好的是PK。對於合成的特殊用例,你肯定需要在特殊用例中看到int id(這裏是http://stackoverflow.com/a/38340726)。 – Drew

+0

爲什麼添加一個代理鍵到什麼已經是代理鍵?除非決議表要成爲另一個細節的主人,否則沒有理由在表中添加另一個無意義的關鍵字。作爲一個行業,我們對替代品感到瘋狂,恕我直言。 –

回答

0

爲什麼沒有一個單獨的表ID並使其成爲主鍵?

因爲你會那麼需要在AuthIDBookID創建唯一索引,以確保(AuthID, BookID)重複的對不插入此表。

有許多索引通常會減慢插入和更新並增加磁盤上數據的大小。通過使用複合主鍵,該問題被最小化。儘管如此,某些ORM最值得注意的是Django,不支持多列主鍵。因此,Django的ManyToManyField確實有一個連續的主鍵和(AuthID, BookID)上的一個不起作用的鍵 - 正是您詢問的替代方法。

+0

請加入[Campaigns](http://chat.stackoverflow.com/rooms/95290/campaigns)以嘗試處理'mysql'文檔。 Thx e4c5 – Drew

+0

很樂意做@Drew – e4c5