2010-12-21 58 views
25

如果我有兩個具有多對多關係的對象,我通常會在我的數據庫模式中使用多對多表建模它們以將兩者關聯起來。但是,該多對多表(或「連接表」)是否有自己的主鍵(整數自動遞增)?多對多表有主鍵嗎?

例如,我可能具有表A和B,每一個ID,並且具有(A_ID,B_ID)的外鍵元組的表中調用A_B。但是,A_B應該有一個自己增加了主鍵的ID列,還是沒有?

添加它有哪些優缺點?我個人喜歡用於多對多連接的自然鍵。但主鍵添加會帶來什麼好處?

+1

http://stackoverflow.com/questions/2190272/sql-many-to-many-table-primary-key的副本。 – 2010-12-21 21:09:59

+0

我們應該刪除這個問題嗎? – ashes999 2010-12-21 21:30:44

回答

17

我同意一切,除了

奧德說:「這不能合理地或者用作 外鍵。」

在這種情況下,它是一個選擇你的毒藥,映射表絕對可以是父母,這只是一個孩子使用多列FK或不。

以汽車和顏色爲例。每年Auto Makers都有一定的托盤顏色,每種型號只能使用有限數量的這些顏色。許多 - 許多::顏色到汽車模型

所以現在的設計,其中新訂單的汽車存儲Order表。清晰的顏色和模型將在訂單表上。如果您爲每個表格創建FK,則數據庫將允許選擇不正確的模型/顏色組合。 (當然,你可以用代碼來強制執行,不能用聲明方式強制執行。)如果你讓父對象成爲many:many表,你只會得到已經指定的組合。

那麼你願意有一個多列FK,並指向建立在ModelID和ColorID上的PK,還是你想要一個單列FK?

挑你的毒藥。

編輯

但是,如果它不是的東西父母,沒有表需要一個代理鍵。

10

這樣的代理鍵除了開銷之外什麼都不加。

如果您關心此表中的重複,請使用自然鍵,使它們成爲複合主鍵。

要展開:

在應用中,這關鍵將是毫無意義的,將繼續使用。

在數據庫中,它不會有任何作用,因爲你不能合理地使用它在查詢的任何類型的有意義的結果的。

它也不能合理地用作外鍵。

+0

是的,我能看到的唯一用途是,如果你想限制刪除到一個記錄 - 但是這會導致額外的ID查找,假設你有兩個外鍵ID。我同意。 – ashes999 2010-12-21 21:30:00

+1

@ ashes999 - 你不應該在這張表(或者任何表格)中有重複的行。如果你不這樣做,那麼刪除一行將只需要兩個外鍵。 – Oded 2010-12-21 21:33:51

0

它並沒有提供任何有用的東西。請記住鑰匙的目的,即唯一指「某物」。像這樣的關聯表本身不是「某種東西」,而是兩個已經有鍵的其他「事物」的持久性結構。除了持久性媒介(數據庫)之外,它沒有意義,甚至不應該真正存在或不被知道(例如在業務領域),所以不應該有理由指稱它它自己的ID。

+0

正是我的論點。真實對象應該有ID來標識它們。 – ashes999 2010-12-21 21:30:23

1

我已經完成了這兩種方法。有時在路上添加功能是有益的。例如,如果有一段時間表格中的某一行將不止包含任何2個id以上的內容。如果你沒有空間,我會把它放在那裏,只是因爲它不會受傷。有時它可能會干擾像休眠或ADO.NET這樣的ORM工具,但這很小。

所以總結一下... PROS 1.允許未來潛在增長。

CONS 1.空間 2.混淆了一些ORM工具。

1

術語「連接表」經常被使用,但我認爲我從未見過它正確定義或解釋。我個人避免使用這個術語。據我所知,「連接表」是指任何帶有兩個外鍵(或可能多於兩個?)的表。

我認爲用多個外鍵選擇表中的鍵的標準應該和其他表中的相同。問問你自己需要執行哪些依賴關係,什麼是獨特的和不可約的。選擇熟悉度,穩定性和簡單性標準的按鍵。只有當你有充分的理由時才添加代理鍵。