我在表中有兩列,將總是是唯一的,vendor_identifier
和product_identifier
。他們兩人的長度大致相等。我是否應該將它們都作爲主鍵添加,或者只添加一個,或者其中的一些變體?在這裏添加一個或兩個是否有區別?數據庫的一個或兩個主鍵
回答
您只能有一個是主鍵。你可以讓另一個是一個UNIQUE鍵。
Whichever you prefer to be the default PRIMARY KEY is your choice。
有你需要問自己一句:
- 將有兩列的表格允許多個產品?
- 是否有一個表中有兩列允許多個供應商?
- 是否有一個表有兩列允許元組(供應商,產品)一次或多次?
回答這些rhetorial問題會幫助你決定表是否有以下作爲主鍵
- vendor_identifier
- product_identifier
- vendor_identifier之一,product_identifier
是否通過這兩個鍵查詢?或者當時可能有一個?
取決於你可以做一個綜合指數或兩個不同的指標..如果您要添加兩種不同的指標答案記住,最常用的一個應該是at the left
但基本上一切都取決於你的應用程序的架構/和您選擇使用的數據庫模式...
考慮如下:
(1) is the combination of vendor_id and product_id also guaranteed to be unique?
(2) will you always search with both vendor_id and product_id?
複合主鍵只有在您對兩者都回答yes時纔有意義。如果你不能,那麼只需選擇基數較高的一個作爲主鍵,並在另一個上創建一個二級索引。
如果vendor_id保證是唯一的 - 並且OP說它是 - 那麼無論你將它與什麼組合,它也將是唯一的。複合鍵不是由預期的搜索模式決定的;它們由功能依賴性等決定。 – 2012-01-13 23:42:57
@Catcall如果您在vendor_product表中將vendor_id與相同的product_id組合了兩次(反之亦然),它將不會是唯一的。我認爲這就是馬里奧指出的。此外,使用搜索標準是確定功能依賴性的實用方法。 – 2012-01-14 02:43:08
如果您*可以*將vendor_id與同一個product_id兩次結合,那麼vendor_id在該表中不唯一。 – 2012-01-14 03:58:19
在MySql中,主鍵獲取聚集索引,所以您應該使主鍵成爲您最常查詢的唯一標識符。 (這包括連接)。
從你的問題來看,這兩個字段各自是獨一無二的,還是隻能保證它們是唯一的組合。如果它們應該始終是獨一無二的,那麼至少應該爲它們分別設置一個獨立的索引。如果它們只有一個獨特的組合,那麼這是唯一性的唯一保證,主鍵應該是它們中的兩個一起作爲單個關鍵。
,因爲你不說明你的表 - 我會建議你實際上這裏有3個表:
VENDOR
--------
vendor_id
other_cols
PRODUCT
---------
product_id
other_cols
VENDOR_PRODUCT
--------------
vendor_id
product_id
price-description-dates etc.
在這種情況下 - 在供應商表中的VENDOR_ID是PK。 在產品表中的PRODUCT_ID是PK(該表)
在VENDOR_PRODUCT表VENDOR_ID是一個外鍵 的PRODUCT_ID在VENDOR_PRODUCT表的外鍵
您可以選擇強制唯一性在VENDOR_PRODUCT表中的VENDOR_ID,PRODUCT_ID對中,或者不是您選擇的。如果唯一,它們可能在該表中充當COMPOUND KEY。如果您需要從架構中的其他位置引用VENDOR_PRODUCT中的行,那麼您可以考慮使用新的單值主鍵,而不是將這兩列複製到新表並嘗試獲得正確的FK定義。
downvoter謹慎解釋? – Randy 2012-02-13 21:08:01
假設vendor_identifier是與供應商表相關的外鍵,而product_identifier是與產品表相關的外鍵,我會創建一個自動編號字段(vendor_product_identifier,也許是?)作爲表的主鍵在其中既有vendor_id又有product_id。然後,我會在vendor_id和product_id的組合上放置一個唯一索引。
所以,一般的想法是:
Vendor
------
vendor_identifier PK
name
phone
etc...
Product
-------
product_identifier PK
name
category
etc...
Vendor_Product
--------------
vendor_product_identifier //"AUTONUMBER PK"
vendor_identifier //"FK to Vendor, and part of COMBOINDEX1"
product_identifier //"FK to Vendor, and part of COMBOINDEX1"
etc...
具有vendor_product一個新的密鑰給你的一個關鍵是傳遞在應用側指兩個供應商和產品的組合。在vendor_product表中有vendor_id和product_id組合的唯一索引可確保您不會獲得該數據組合的重複條目(必須是唯一的索引,但不僅僅是索引)。
- 1. 訪問數據庫兩個主鍵
- 2. 將一個或多個數據庫與主數據庫同步 - 外鍵
- 3. 一個外鍵和兩個主鍵
- 4. 兩個主鍵
- 5. 數據庫規範化 - 兩個具有相同主鍵的表?
- 6. 兩個數據庫之間的外鍵
- 7. 在比較兩個主鍵後,更新一個數據表
- 8. 在一個表中有兩個外鍵的MySQL數據庫
- 9. 多對多表中的一個或兩個主鍵?
- 10. A柱作爲主鍵或兩個外鍵爲主鍵
- 11. 兩個或多個程序實例與一個數據庫
- 12. 爲兩個系統創建一個或單獨的數據庫?
- 13. MySQL同一個數據庫兩個主機替換成
- 14. SQL,兩個表,一個共享主鍵
- 15. Laravel關係,一個數據庫有兩個外鍵
- 16. 使用主鍵和其他鍵將表從一個數據庫移動到另一個數據庫
- 17. 數據庫主鍵
- 18. 數據庫主鍵
- 19. 數據建模兩個引用相同主鍵的外鍵
- 20. 生成跨多個數據庫唯一的主鍵
- 21. 從另一個數據庫中的表更新主鍵
- 22. 關係數據庫設計 - 一個表中的雙主鍵?
- 23. 爲什麼我的數據庫表需要一個主鍵?
- 24. 數據庫設計多表的主鍵鏈接到一個表
- 25. rails:兩個站點 - 一個數據庫
- 26. 兩個數據庫和一個更新
- 27. 我使用一個或兩個數據庫嗎?
- 28. 數據庫設計一個表或兩個表
- 29. 最好有一個或兩個數據庫?
- 30. 向同一主表的兩個外鍵
你的意思是「TABLE」而不是「DATABASE」?數據庫沒有主鍵,表具有。 – 2012-01-13 21:20:44