關于數(shù)據(jù)庫表的主鍵ID的數(shù)據(jù)類型(使用GUID和自增長類型)的疑惑
我發(fā)現(xiàn)好多的項目中現(xiàn)在流行的數(shù)據(jù)表主鍵是GUID,一般在數(shù)據(jù)庫中的存儲類型為char(36)。但是我個人感覺這個設計很浪費資源:一是字段長度是36(點位36字節(jié)),而自增長只占8字節(jié)(int);二是貌似在此字段上建立索引沒有什么實際作用(GUID中字符無序的);三是在二、三范式下關聯(lián)查詢時主鍵偏偏又是關聯(lián)字段,增加了記錄的行長度的同時查詢用索引又無實際效果。在這三種情況下我覺得用GUID做主鍵簡直是“暴殄天物”(個人認為),可為什么還有好多人這么用呢?而且在百度找這方面的資料時,看到有人說用自增長作主鍵的人都是國內不專業(yè)的開發(fā)人員(聽那口氣貌似對這樣的人很不屑的樣子)。
我就疑惑了,用GUID作主鍵就很專業(yè)嗎,那么對于數(shù)據(jù)查詢速度的考慮呢?
老師,你們在開發(fā)過程中是用什么做主鍵的呢,很糾結,希望老師能回復下,謝謝
2017-02-08
對于大數(shù)據(jù)量,建議使用guid做主鍵。而使用int會得到最佳的性能。公司一般都會是為了安全防止注入等讓別人獲取不到數(shù)據(jù),一般都是數(shù)據(jù)會加密的,而int作為主鍵的確適合數(shù)據(jù),但是如果數(shù)據(jù)大量超出int呢。而且他很難控制分布式的數(shù)據(jù)表。
使用INT做主鍵的優(yōu)點:
??? 1、需要很小的數(shù)據(jù)存儲空間,僅僅需要4 byte 。
??? 2、insert和update操作時使用INT的性能比GUID好,所以使用int將會提高應用程序的性能。
??? 3、index和Join 操作,int的性能最好。
??? 4、容易記憶。
??? 5、支持通過函數(shù)獲取最新的值,如:Scope_Indentity() 。
使用INT做主鍵的缺點
??? 1、如果經常有合并表的操作,就可能會出現(xiàn)主鍵重復的情況。
??? 2、使用INT數(shù)據(jù)范圍有限制。如果存在大量的數(shù)據(jù),可能會超出INT的取值范圍。
??? 3、很難處理分布式存儲的數(shù)據(jù)表。
使用GUID做主鍵的優(yōu)點:
??? 1、它是獨一無二的。
??? 2、出現(xiàn)重復的機會少。
??? 3、適合大量數(shù)據(jù)中的插入和更新操作。
??? 4、跨服務器數(shù)據(jù)合并非常方便。
使用GUID做主鍵的缺點:
??? 1、存儲空間大(16 byte),因此它將會占用更多的磁盤大小。
??? 2、很難記憶。join操作性能比int要低。
??? 3、沒有內置的函數(shù)獲取最新產生的guid主鍵。
??? 4、GUID做主鍵將會添加到表上的所以其他索引中,因此會降低性能。