2011-03-31 85 views
5

我試圖將我的設計感受從LAMP堆棧轉移到Microsoft堆棧,並且我只想到了一些東西 - 何時我想要使用GUID?它與舊的,可靠的自動遞增int相比有什麼好處/缺點?GUID與int ID自動增量

回答

8

除了autoincremental ID之外,您的體驗永遠不需要任何東西,這可能意味着GUID通常是解決問題的方法。使用它們的時候,如果你碰到一個你熟悉的模式不起作用的需求。微軟是無關緊要的。

我見過的唯一現實場景是合併來自兩個來源的表格。

+0

Guids對種子數據來說非常好 – 2013-04-12 13:21:12

3

一個問題的GUID:

因爲他們不是連續的,該數據庫將不得不努力工作,以更新索引。使用順序標識符,通常可以將其附加到最後(或多或少)。由於GUID是隨機的,因此必須將其放入現有的塊中。也就是說,我們對某些表使用GUID,即使在相當重的負載下它們似乎也能正常工作。

+0

好了,但是當我想用他們? – 2011-03-31 11:34:02

+1

順序guid解決這個問題,例如http://stackoverflow.com/questions/170346/what-are-the-performance-improvement-of-sequential-guid-over-standard-guid – Douglas 2015-06-17 13:47:56

1

「舊的,可靠的自動遞增的int」取決於數據庫需要的可擴展性。當您至少有兩個主設備的設置時,自動遞增停止在平凡的情況下工作。當然,解決這個問題並不難,因爲這是一個普遍的問題。不同的數據庫引擎可以協調主設備之間的順序,例如,只有一個主設備可以從任何給定的順序分配。

當你分解數據時,通常需要知道鍵的分片。自動遞增的ID不包含有關哪個分片應該託管該記錄的信息。

GUID以不同的方式解決問題;兩個不同的主設備具有不同的主機標識符(通常是一個MAC地址)。由於用於計算新的GUID,所以不同的主人不能創建相互衝突的guid。此外,因爲主機是ID的一部分,所以它可以用來直接標識保存記錄的分片。

第三種選擇是根本不使用代理鍵(既不自動增加整數也不使用guid)。

+0

通常會看到多個GUID來自同一個主機;或沒有MAC地址的設備。 – dkretz 2011-03-31 02:39:20

+0

出於好奇,你多久看一次重複? – Dave 2011-03-31 03:03:45

+0

這個答案大部分都在我頭上。我沒有必要一次處理比1db更復雜的任何事情。不過,+1爲我提供了一些研究條款。 ;-) – 2011-03-31 11:33:38

0

我建議使用int ID代替的Guid,原因如下:

  • 詮釋ID的大小爲4個字節(32位),然而的Guid具有16個字節(128位)的尺寸,其4倍大。在這種情況下,你可能有性能問題和存儲implaication
  • 默認的GUID不連續(要小心)
  • 很容易想象表
  • 之間的聯繫和關係