2009-12-03 74 views
2

如果將標識列作爲主鍵是一種很好的做法,能否請您主張? 對於ORM工具,在表上有標識列有幫助。但還有其他副作用,如意外重複插入。標識列作爲主鍵

感謝 Nayn

+0

與應用程序中生成的自然鍵或代理鍵(hi/lo,guid等)相反? – 2009-12-03 07:11:00

+0

請參閱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

回答

3

對於服務器端生成的密鑰,在沒有複製或大量數據合併的環境中,IDENTITY密鑰是一種很好的做法。他們實施的方式,他們不允許在同一個表中重複,所以不要擔心。它們還具有將不具有大量DELETE的表中的碎片最小化的優點。

GUID是通常的選擇。他們的優勢是您可以在Web層創建它們,而無需往返數據庫。但是,它們比IDENTITIES大,並且會導致極端的表碎片。由於它們是(半)隨機的,所以插入遍佈整個表格,而不是集中在最後一頁。

+1

爲了解決GUID的問題碎片,使用COMB風格的GUID而不是標準的完全隨機的。在MSSQL上,有一種半COMB實現,有時「足夠好」,但不能保證跨服務器重啓時的頁面插入。在大多數情況下,int或bigint與GUID(128位)之間的空間差異不值得擔心。 – richardtallent 2009-12-03 07:54:34

+0

除了在服務器重啓之間不保持順序(如果那麼長),NEWSEQUENTIALID功能也不會阻止碎片或頁面拆分;它只是將它本地化在一個區域,直到值重置。另外,NEWSEQUENTIALID只能用作列默認值,所以它只能在服務器上生成。此外,以這種方式生成的GUID比「純」GUID更具可猜測性 - 因此,使用GUID超過IDENTITY的三個好處並不適用於NEWSEQUENTIALID。 – RickNZ 2009-12-03 09:18:13

0

我使用GUID,因爲它在我處理的分佈式應用程序確實有幫助。尤其是當所有分佈式實例也需要創建新數據時。

不過,在簡單的情況下,我看不到任何與自動增量整數主鍵有關的問題。我更喜歡它們,因爲它更容易直接使用SQL查詢,因爲它更易於記憶。

4

是的,使用INT(或BIGINT)IDENTITY是SQL Server非常好的做法。

SQL Server使用主鍵作爲其默認的聚集鍵和聚集鍵應該始終有這些屬性:

  • 靜態
  • 獨特
  • 不斷增加

INT IDENTITY完美適合您的賬單!

欲瞭解更多的背景信息,尤其是一些信息,爲什麼一個GUID作爲主(因此聚集鍵)是一個的想法,看到金佰利特里普的優秀帖子:

如果你有理由使用GUID作爲主鍵(例如。複製),那麼通過所有方法確保在這些表上有一個INT IDENTITY作爲您的集羣密鑰

Marc