標識列作爲主鍵
回答
對於服務器端生成的密鑰,在沒有複製或大量數據合併的環境中,IDENTITY密鑰是一種很好的做法。他們實施的方式,他們不允許在同一個表中重複,所以不要擔心。它們還具有將不具有大量DELETE的表中的碎片最小化的優點。
GUID是通常的選擇。他們的優勢是您可以在Web層創建它們,而無需往返數據庫。但是,它們比IDENTITIES大,並且會導致極端的表碎片。由於它們是(半)隨機的,所以插入遍佈整個表格,而不是集中在最後一頁。
爲了解決GUID的問題碎片,使用COMB風格的GUID而不是標準的完全隨機的。在MSSQL上,有一種半COMB實現,有時「足夠好」,但不能保證跨服務器重啓時的頁面插入。在大多數情況下,int或bigint與GUID(128位)之間的空間差異不值得擔心。 – richardtallent 2009-12-03 07:54:34
除了在服務器重啓之間不保持順序(如果那麼長),NEWSEQUENTIALID功能也不會阻止碎片或頁面拆分;它只是將它本地化在一個區域,直到值重置。另外,NEWSEQUENTIALID只能用作列默認值,所以它只能在服務器上生成。此外,以這種方式生成的GUID比「純」GUID更具可猜測性 - 因此,使用GUID超過IDENTITY的三個好處並不適用於NEWSEQUENTIALID。 – RickNZ 2009-12-03 09:18:13
我使用GUID,因爲它在我處理的分佈式應用程序確實有幫助。尤其是當所有分佈式實例也需要創建新數據時。
不過,在簡單的情況下,我看不到任何與自動增量整數主鍵有關的問題。我更喜歡它們,因爲它更容易直接使用SQL查詢,因爲它更易於記憶。
是的,使用INT(或BIGINT)IDENTITY是SQL Server非常好的做法。
SQL Server使用主鍵作爲其默認的聚集鍵和聚集鍵應該始終有這些屬性:
- 窄
- 靜態
- 獨特
- 不斷增加
INT IDENTITY完美適合您的賬單!
欲瞭解更多的背景信息,尤其是一些信息,爲什麼一個GUID作爲主(因此聚集鍵)是一個壞的想法,看到金佰利特里普的優秀帖子:
- GUIDs as PRIMARY KEYs and/or the clustering key
- The Clustered Index Debate Continues...
- Ever-increasing clustering key - the Clustered Index Debate..........again!
如果你有理由使用GUID作爲主鍵(例如。複製),那麼通過所有方法確保在這些表上有一個INT IDENTITY作爲您的集羣密鑰!
Marc
- 1. 重置主鍵(int作爲標識)
- 2. 更改主鍵和標識的表列
- 3. Oracle 12c:如何將現有主鍵列修改爲標識列?
- 4. 將SQL標識創建爲主鍵?
- 5. 非標識主鍵驗證
- 6. 同步數據庫時唯一的標識符作爲主鍵
- 7. Xunit - 如何使用Moq和EF Core作爲標識主鍵
- 8. T-SQL的唯一標識列作爲複合主鍵的一部分
- 9. 在其他地方用作外鍵的主鍵的標識
- 10. 爲什麼使用多列作爲主鍵(複合主鍵)
- 11. @@標識是否返回主鍵或標識字段?
- 12. LINQ to SQL:插入非標識主鍵
- 13. Grails:外鍵作爲主鍵?
- 14. guid作爲主鍵?
- 15. 使用「rowversion」作爲主鍵列
- 16. SQL Server計算列作爲主鍵
- 17. SQL JPA - 多個列作爲主鍵
- 18. 在標識列上的SQL Server 2005主鍵違規
- 19. 如何使用SQLAlchemy創建不是主鍵的標識列?
- 20. 加載數據後創建主鍵和標識列
- 21. 哪個標識字段在MySQL數據庫中用作主鍵?
- 22. 創建列不是主鍵但在sqlalchemy上爲sql服務器標識
- 23. 使用唯一標識符作爲主鍵的好處?在sql服務器
- 24. 從數據庫表中檢索主鍵,標識列和特定名稱列
- 25. varchar列上的標識鍵 - T-SQL
- 26. 與VARCHAR作爲主鍵
- 27. 使用oid作爲主鍵
- 28. 如何避免使用GUID(作爲UserId)作爲asp.net mvc標識表中的主鍵?
- 29. 號碼作爲標識符
- 30. Laravel 5.2鋒主鍵作爲多鍵
與應用程序中生成的自然鍵或代理鍵(hi/lo,guid等)相反? – 2009-12-03 07:11:00
請參閱http://stackoverflow.com/questions/262547/reasons-not-to-use-an-auto-incrementing-number-for-a-primary-key,因爲這可能是dup – Rippo 2009-12-03 07:21:02