2012-01-13 46 views
1

我在表中有兩列,將總是是唯一的,vendor_identifierproduct_identifier。他們兩人的長度大致相等。我是否應該將它們都作爲主鍵添加,或者只添加一個,或者其中的一些變體?在這裏添加一個或兩個是否有區別?數據庫的一個或兩個主鍵

+2

你的意思是「TABLE」而不是「DATABASE」?數據庫沒有主鍵,表具有。 – 2012-01-13 21:20:44

回答

0

您只能有一個是主鍵。你可以讓另一個是一個UNIQUE鍵。

Whichever you prefer to be the default PRIMARY KEY is your choice

有你需要問自己一句:

  • 將有兩列的表格允許多個產品?
  • 是否有一個表中有兩列允許多個供應商?
  • 是否有一個表有兩列允許元組(供應商,產品)一次或多次?

回答這些rhetorial問題會幫助你決定表是否有以下作爲主鍵

  • vendor_identifier
  • product_identifier
  • vendor_identifier之一,product_identifier
1

是否通過這兩個鍵查詢?或者當時可能有一個?

取決於你可以做一個綜合指數或兩個不同的指標..如果您要添加兩種不同的指標答案記住,最常用的一個應該是at the left

但基本上一切都取決於你的應用程序的架構/和您選擇使用的數據庫模式...

0

考慮如下:

(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時纔有意義。如果你不能,那麼只需選擇基數較高的一個作爲主鍵,並在另一個上創建一個二級索引。

+0

如果vendor_id保證是唯一的 - 並且OP說它是 - 那麼無論你將它與什麼組合,它也將是唯一的。複合鍵不是由預期的搜索模式決定的;它們由功能依賴性等決定。 – 2012-01-13 23:42:57

+0

@Catcall如果您在vendor_product表中將vendor_id與相同的product_id組合了兩次(反之亦然),它將不會是唯一的。我認爲這就是馬里奧指出的。此外,使用搜索標準是確定功能依賴性的實用方法。 – 2012-01-14 02:43:08

+0

如果您*可以*將vendor_id與同一個product_id兩次結合,那麼vendor_id在該表中不唯一。 – 2012-01-14 03:58:19

1

在MySql中,主鍵獲取聚集索引,所以您應該使主鍵成爲您最常查詢的唯一標識符。 (這包括連接)。

從你的問題來看,這兩個字段各自是獨一無二的,還是隻能保證它們是唯一的組合。如果它們應該始終是獨一無二的,那麼至少應該爲它們分別設置一個獨立的索引。如果它們只有一個獨特的組合,那麼這是唯一性的唯一保證,主鍵應該是它們中的兩個一起作爲單個關鍵。

0

,因爲你不說明你的表 - 我會建議你實際上這裏有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定義。

+0

downvoter謹慎解釋? – Randy 2012-02-13 21:08:01

0

假設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組合的唯一索引可確保您不會獲得該數據組合的重複條目(必須是唯一的索引,但不僅僅是索引)。