我有兩個表,products
和categories
它們之間有多對多的關係,所以我添加了一個products_categories
表,它將包含category_id
和product_id
。我應該在多對多的「鏈接」表中使用索引列嗎?
我應該添加另一個(自動遞增)索引列或使用兩個現有的主鍵?
我有兩個表,products
和categories
它們之間有多對多的關係,所以我添加了一個products_categories
表,它將包含category_id
和product_id
。我應該在多對多的「鏈接」表中使用索引列嗎?
我應該添加另一個(自動遞增)索引列或使用兩個現有的主鍵?
這取決於。
你看到你的數據更是集對象(與關係數據庫僅僅是 的存儲介質)或事實的集合代表,並通過關係代數本身 分析。
某些ORM /框架/工具對多列主鍵沒有很好的支持。 如果您碰巧使用其中一個,則需要額外的id列。
如果它只是一個多對多的關係而沒有附加的數據關聯, 最好是避免附加的id列並將兩個列作爲主鍵。
如果你想添加一些額外的信息到這個協會,那麼它會變成 兩個實體的多對多關係。 因此,它變成了它自己的實體,如果它擁有獨立於它所連接的實體的自己的ID ,它會更方便。
我會使主鍵category_id和product_id。僅當訂單在以後的使用中與相關時相關時才添加自動增量。
不,根本不需要,因爲這兩列已經在執行主鍵的功能。
這第三列只是爲您的表增加更多空間。
但是...你可以用它來查看你的記錄添加到你的表的順序。這是我能看到的專欄中唯一的功能。
您不需要添加自動遞增索引列。標準做法是僅使用兩個現有列作爲M:M關聯表的主鍵,就像您所描述的那樣。
你不需要需要添加一個額外的自動遞增索引列,但我(也許違背大多數人)仍然建議你這樣做。首先,在應用程序中使用單個數字來引用一行是比較容易的,例如,當您刪除一行時。其次,它有時能夠知道添加行的順序是有用的。
請勿使用自動編號功能在行上施加自然的時間順序。自動編號的實現者可以自由地實現打破這種關聯的算法。 – 2013-07-13 19:20:32
有一個概念上的問題 - 是products_categories一個實體還是簡單地表示一個表,表示兩個實體之間的關係?如果它是一個實體,那麼即使沒有其他屬性,我也會爲該實體提供一個單獨的ID列。如果它是一種關係,如果還有其他屬性(比如begin_date,end_date或類似的東西),我會主張擁有一個多列主鍵。
+1覆蓋所有的基地。 – APC 2009-12-03 12:56:42