2012-01-19 35 views
1

這是更多的設計問題,然後編程一個。若要使列上唯一的組合或添加數字rowID

我在那裏我存儲有關零售產品的詳細信息的表格:

Name Barcode BarcodeFormat etc... 
---------------------------------------- 

(Name, Barcode, BarcodeFormat)三列將唯一標識表(候選鍵)的記錄。但是,我還有其他需要FK的桌子。於是我介紹了auto_incrementitemId並提出了PK。

我的問題是 - 我應該有PK(itemId, Name, Barcode, BarcodeFormat)或者是否應該有PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)

我最關心的是INSERTSELECT操作方面,而且在尺寸評論也歡迎表演。

我使用的是mysql

回答

5

絕對的innodb表:PK(的itemId)和UNIQUE(名稱,條形碼,BarcodeFormat)。

  • 你不想使用多部分鍵的麻煩您所有的連接等
  • 您也許有一天有了行沒有它本身就不是唯一條形碼值,所以你不要並不希望你的模型具有硬連線的獨特性(你可以在不破壞任何關係的情況下輕鬆地刪除它)
  • 對唯一性的約束是一個業務級問題,而不是數據庫實體之一:你總是需要一個密鑰,但您並不總是需要唯一性的業務規則
+0

喜歡它...... –

+0

-1'主鍵'的選擇是任意的。最後一點特別令人困惑:完整性約束應該是業務規則數據庫中的邏輯表示;如果他們不是那麼你是在做一些嚴重錯誤的事情! – onedaywhen

+0

@onedaywhen你完全錯過了我的觀點。獨特的組合是*商業*爲中心的概念,因此隨着業務需求的變化,隨時可能隨時發生變化(如我的完全合理的產品示例*沒有條形碼,這將打破獨特的約束)。但是,對主鍵的需求是*永久性的,因此可能會超過對唯一約束的需求。通過分離這兩者,您可以提高靈活性和可維護性。通過合併兩者,您將數據庫要求鎖定到*當前*業務需求(您最好希望業務不會發生變化) – Bohemian

2

除非您擁有數百萬種產品或非常高的吞吐量要求,否則在性能方面不會有太大的差別。

我的首選是有一個代理PK(即自動增量列,您的第二個選項PK(itemId)UNIQUE(Name, Barcode, BarcodeFormat)),因爲如果業務密鑰更改更易於管理。

0

如果你已經添加了一個itemId,那麼你應該使用它作爲PK,並有其他三列與一個UNIQUE。

如果你沒有itemId,那麼你可以使用其他列作爲PK,但它可能會變得很難在任何地方。在這種情況下,它並不是很好,因爲產品應該有一個id,因爲它是一個實體,但是如果它只是一個關係,那麼就不會有id列。

1

您有兩個候選鍵。我們將三列複合鍵稱爲'自然鍵'和auto_increment列(在這種情況下)是'代理鍵'。在數據庫級別都需要唯一約束(小寫字母表示「唯一」以表示邏輯)。

可選地,一個候選鍵可以被指定爲「主要」。選擇哪個鍵(如果有的話)應該是這個名稱是任意的。謹防任何人在這件事上給你明確的建議!