可能重複:
How do you like your primary keys?GUID VS INT IDENTITY
我所知道的使用GUID的好處,以及使用和INT如在PK的好處一個數據庫。考慮到一個GUID本質上是一個128位的INT,而一個正常的INT是32位,INT是一個節省空間的機器(儘管在大多數現代系統中這一點通常都是有意義的)。
最後,在什麼情況下你會看到自己使用INT作爲PK與GUID?
可能重複:
How do you like your primary keys?GUID VS INT IDENTITY
我所知道的使用GUID的好處,以及使用和INT如在PK的好處一個數據庫。考慮到一個GUID本質上是一個128位的INT,而一個正常的INT是32位,INT是一個節省空間的機器(儘管在大多數現代系統中這一點通常都是有意義的)。
最後,在什麼情況下你會看到自己使用INT作爲PK與GUID?
金伯利特里普(SQLSkills.com)有an article上使用GUID的主鍵。由於不必要的開銷,她提出反對意見。
還沒有閱讀[本系列](http://sqlblogcasts.com/blogs/tonyrogerson/archive/2011/07.aspx),但我認爲託尼羅傑森爭辯說,與SSD的碎片問題大大減少 – 2011-09-10 10:53:06
INT在調試時肯定比讀取更容易,而且要小得多。
但是,我會使用GUID或類似的許可證密鑰作爲產品。你知道這將是獨一無二的,而且你知道這不會是連續的。
當比較諸如主鍵與外鍵之類的值時,INT會更快。如果表格正確編制索引並且表格很小,則可能看不出太多緩慢,但您必須嘗試確定。 INT也更容易閱讀,並與其他人交流。要說「你能看看第1234條記錄嗎?」要簡單得多嗎?而不是「你能看看記錄031E9502-E283-4F87-9049-CE0E5C76B658?」
您可以總是使用哈希來緩解這個問題http://hashids.org/ – Korayem 2016-04-13 16:37:57
某些操作系統基於獨特的硬件功能(CPUID,MAC)不再生成GUID,因爲它使跟蹤用戶容易(隱私問題)。這意味着GUID的獨特性往往不像許多人想象的那樣普遍。
如果您使用數據庫的某些自動識別功能,理論上可以使數據庫絕對確保沒有重複。
這些天的GUID通常是隨機產生的 – 2009-05-06 13:26:16
@Marco你能否提供一些參考文檔來支持它?我從來沒有聽說過這個。 – 2011-08-11 18:50:06
這已經是時代的新聞了。除其他外,簡單地看維基百科http://en.wikipedia.org/wiki/Globally_unique_identifier最顯着的算法部分 – 2011-08-12 09:53:21
我一直認爲PK的數字應該是可能的。不要忘了將GUID作爲PK可能意味着它們也會用作其他表格作爲foriegn鍵,因此分頁和索引等會更大。
我認爲數據庫也很重要。從MySQL的角度來看 - 一般來說,數據類型越小,性能越快。
這似乎對於int持有真正VS GUID太 - http://kccoder.com/mysql/uuid-vs-int-insert-performance/
我會使用GUID作爲PK僅當此關鍵界限,以類似的價值。例如,用戶標識(WinNT中的用戶使用GUID進行描述)或用戶組標識。 另一個例子。如果您在全球不同地方開發分佈式系統來進行文檔管理和系統的不同部分,可以創建一些文檔。在這種情況下,我會使用GUID,因爲它保證在分佈式系統的不同部分創建的2個文檔不會具有相同的ID。
要回答你的問題: 最終,在什麼情況下你會看到自己使用INT作爲PK與一個GUID?
我會用一個GUID,如果我的系統將有一個在線/離線版本的離線版本中,你可以保存數據和同步過程中的數據被傳輸到服務器的一天。這樣,你確信你的數據庫裏不會有兩次相同的密鑰。
如果數據存在於單個數據庫中(就像我們通常寫的應用程序的大部分數據一樣),那麼我使用IDENTITY
。很容易,打算以這種方式使用,不會對聚集索引進行分段並且綽綽有餘。如果你在一張桌子上有很多記錄,那麼你會在麪包上留下20億份記錄(如果你使用負值,則會有40億份記錄),但是如果你有數據倉庫問題,那麼你就會敬酒。
如果數據存在於多個獨立的數據庫或與第三方服務的接口中,那麼我將使用可能已經生成的GUID
。一個很好的例子是數據庫中的UserProfiles表,它通過Active Directory分配給它們的objectGUID
將Active Directory中的用戶映射到應用程序中的用戶配置文件。
的INT是節省空間(儘管這 點一般在實際意義最現代化 系統)。
並非如此。它可能乍看之下,但請注意,每個表的主鍵將在索引中的整個數據庫中重複多次,並在其他表中作爲外鍵重複使用。它將涉及幾乎任何包含它的表的查詢 - 並且當它是用於連接的外鍵時非常密集。此外,請記住,現代CPU非常非常快,但RAM速度並沒有跟上。緩存行爲因此變得越來越重要。獲得良好緩存行爲的最佳方式是擁有更小的數據集。因此,4字節和16字節之間看似不相關的差異很可能會導致速度上的明顯差異。不一定總是 - 但這是需要考慮的事情。
如果您打算在某個階段合併數據庫,即對於多站點複製類型設置,Guid將會節省很多痛苦。但除此之外,我發現Int更容易。
除了在需要同步多個數據庫實例時做出糟糕的選擇之外,INT還有一個我沒有看到的缺點:插入始終出現在索引樹的一端。當你有一個有很多移動的表時,這會增加鎖爭用(因爲相同的索引頁必須通過併發插入來修改,而GUID將被全部插入到索引中)。如果使用B *樹或類似的數據結構,索引可能也必須更頻繁地重新平衡。
當然,在進行手動查詢和報告構造時,int的眼睛更容易被看到,並且空間消耗可能通過FK用法加起來。
我很希望看到任何測量, SQL Server實際上處理帶有IDENTITY PK的插入重型表。
我們在我們非常複雜的企業軟件中都有Guids。工作順利。
我相信Guids在語義上更適合作爲標識符。在面對這個問題之前,沒有必要擔心績效。謹防過早優化。
任何種類的數據庫遷移還有一個優點。使用Guids你將不會碰撞。如果您嘗試合併多個數據塊,其中使用整數作爲標識,則必須替換它們的值。如果這些舊的價值被用於網站,他們現在將不同於搜索引擎優化。
請注意:此問題在2009年提出。請參閱http://softwareengineering.stackexchange.com/a/337560/156440和http://stackoverflow.com/questions/11938044/what-are-the-best-實踐爲使用指導作爲一個主要關鍵特別rega更多最新的答覆,包括鏈接到金伯利特里普更新的建議。 – HockeyJ 2016-12-06 13:52:07