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