回答
主鍵是表中唯一的鍵,你選擇最唯一標識表中的記錄。所有表都應該有一個主鍵,因爲如果您需要更新或刪除記錄,您需要知道如何唯一標識它。
代理鍵是人工生成的鍵。當你的記錄本質上沒有自然關鍵字時(例如Person
表,因爲有可能兩個在同一日期出生的人具有相同的姓名或記錄在記錄中,因爲它可能發生兩個事件這樣他們攜帶相同的時間戳)。大多數情況下,您會看到這些實現爲自動遞增字段中的整數,或者作爲每條記錄自動生成的GUID。身份證號碼幾乎總是代用鑰匙。
但與主鍵不同,並非所有表都需要代理鍵。如果你有一張列出美國國家的表格,你並不需要他們的身份證號碼。您可以使用州名縮寫作爲主鍵碼。
代用鍵的主要優點是易於保證唯一性。主要缺點是它們沒有任何意義。例如,威斯康星州沒有任何意義,但是當您在地址表的州列中看到「WI」時,您就知道自己在說什麼狀態,而無需查詢您的州中哪個州表。
這是描述的各種按鍵的巨大治療:
我認爲米歇爾Poolet描述它在一個非常明確的方式:
代理鍵是人工製作值,通常是一個 系統管理的遞增計數器,其值可以從1到 n,其中n代表表的最大行數。在SQL Server中, 可以通過將標識屬性分配給具有數字數據類型的 列來創建代理鍵。
http://sqlmag.com/business-intelligence/surrogate-key-vs-natural-key
它通常有助於當您更改標識列複合鍵,你使用一個代理鍵。
我給-1,因爲它沒有解釋的差異。 – TomTom
代理鍵通常是一個數值。在SQL Server中,Microsoft允許您定義具有標識屬性的列以幫助生成代理鍵值。
PRIMARY KEY約束唯一標識數據庫表中的每條記錄。主鍵必須包含UNIQUE值。 主鍵列不能包含NULL值。 大多數表應該有一個主鍵,每個表只能有一個主鍵。
A 代理鍵是一個組成的值,其唯一目的是唯一標識一行。通常,這是由一個自動遞增的ID表示的。
示例代碼:
CREATE TABLE Example
(
SurrogateKey INT IDENTITY(1,1) -- A surrogate key that increments automatically
)
甲主鍵是識別列或一組的表的列。可以是代理鍵或任何其他獨特的列組合(例如複合鍵)。必須是唯一的任何行,不能是NULL
。
示例代碼:用作替代物他們識別東西
CREATE TABLE Example
(
PrimaryKey INT PRIMARY KEY -- A primary key is just an unique identifier
)
所有項標識符。 EFCodd解釋的系統分配的代理人概念[1],如下所示:
數據庫的用戶可能會導致系統生成或刪除的替代, 但它們有在它的值沒有控制,也不是其有價值的 顯示給他們。
這就是通常所說的代用鍵。該定義立即存在問題,但是因爲Codd認爲DBMS提供了這樣的功能。一般來說DBMS沒有這樣的功能。對於至少一些DBMS用戶來說,密鑰通常是可見的,因爲顯而易見的原因,它們必須是。代用品的概念因此在使用上略有變化。該術語通常在數據管理專業中用於表示未公開的密鑰,並將其用作業務域中的標識。請注意,這與密鑰的生成方式或它被認爲是「人爲的」方式基本上無關。所有密鑰由人或機器發明的符號組成。因此,術語「替代品」的唯一可能的意義在於如何使用密鑰,而不是如何創建密鑰或其值如何。
[1]擴展數據庫關係模型捕捉到了更多的含義,E.F.Codd,1979
- 1. 主鍵和身份有什麼區別?
- 2. 只有主鍵和主鍵約束有什麼區別?
- 3. cassandra中的行鍵,主鍵和索引有什麼區別?
- 4. 代理鍵,合成鍵和人工鍵有區別嗎?
- 5. 主鍵和主屬性有什麼區別?
- 6. 檢查和外鍵有什麼區別?
- 7. 主鍵和聚集索引有什麼區別?
- 8. 外鍵和引用鍵有什麼區別?
- 9. 鍵盤加速器和快捷鍵有什麼區別?
- 10. 候選鍵和複合鍵有什麼區別?
- 11. 單鍵和鍵路徑有什麼區別?
- 12. `overload`關鍵字有什麼區別嗎?
- 13. 沒有主鍵或代理鍵?
- 14. 主鍵,唯一鍵和候選鍵之間的區別
- 15. dict.keys()中的關鍵字與關鍵字有什麼區別?
- 16. 候選鍵和主鍵是什麼?
- 17. 右鍵,左鍵和雙鍵 - 你有什麼代碼和什麼時候?
- 18. NServiceBus.Distributor和主節點有什麼區別
- 19. 穩定和主人有什麼區別?
- 20. 爲什麼沒有按鍵處理刪除鍵和退格鍵
- 21. 在Google App Engine中,實體鍵和鍵名稱有什麼區別?
- 22. oracle sql中的join關鍵字和inner join關鍵字有什麼區別?
- 23. 「throw」關鍵字和「Write-Error-ErrorAction Stop」之間有什麼區別?
- 24. C#中的覆蓋和新關鍵字有什麼區別?
- 25. Github和Putty SSH鍵位置配置有什麼區別?
- 26. C#中的enum關鍵字和C有什麼區別?
- 27. 「數據」和「類型」關鍵字有什麼區別?
- 28. 關鍵字:is和==有什麼區別python
- 29. 要解除鍵盤使用`resignFirstResponder`和`endEditing`有什麼區別?
- 30. c和C++之間關鍵字static有什麼區別?
我認爲主要的缺點是,有時候當人們使用自動生成的密鑰(並且不是在沒有自然密鑰存在的情況下,經常使用整數而不是自然密鑰),他們經常忘記在自然密鑰上放置唯一的索引,不要選擇PK。這通常會導致重複進入可能產生問題的系統。自動生成密鑰的兩個主要優點是它們通常會提高聯接中的性能(如果整數不是GUIDS),並且它們會在自然密鑰更改時阻止大量子記錄的大量更新。 – HLGEM
@HLGEM好的,我會買那些。我認爲我專注於缺乏意義,因爲我剛剛在超規範化系統中工作,其中基本上每個字段都是自己的表。它無法確定數據錄入錯誤的發生位置,並且很難應用業務規則來查找問題。 –
我喜歡正常化,但你的確可以把它做得太過分。 – HLGEM