主键设计原则
1.是否要采用GUID作為主鍵
用GUID作主鍵有它的優(yōu)勢(shì)與不足.優(yōu)勢(shì)是GUID具有唯一性,在任何情況下,可以產(chǎn)生全球唯一的值.這是GUID最大的優(yōu)勢(shì),也方便數(shù)據(jù)導(dǎo)入,比如要求從另一個(gè)系統(tǒng)中把數(shù)據(jù)導(dǎo)入進(jìn)來,那么,不用擔(dān)心,導(dǎo)入時(shí),會(huì)導(dǎo)致主鍵沖突.不足是GUID值太復(fù)雜.不易記憶,因?yàn)橛袝r(shí),難免我們會(huì)用記錄的方式,來進(jìn)行記錄判斷.而且數(shù)據(jù)太長(zhǎng),影響數(shù)據(jù)庫(kù)效率.GUID的產(chǎn)生不是以一定的次序產(chǎn)生,對(duì)于按主鍵物理排序的數(shù)據(jù)庫(kù)來說,如果在記錄的前部插入一條記錄,可能會(huì)導(dǎo)致后面N次方的數(shù)據(jù)條數(shù)后移.這將導(dǎo)致數(shù)據(jù)插入效率.因此GUID的采用應(yīng)該要慎重.
2.是否要采用自動(dòng)遞增的方式
對(duì)于以前談到的主鍵,要求唯一性,因此大家都用自動(dòng)遞增的方式.這樣的方式是非常不可取的.可能是為了方便插入記錄時(shí),不必去人為創(chuàng)建主鍵值.以為這樣會(huì)方便,其實(shí)不是的.帶來的麻煩要遠(yuǎn)遠(yuǎn)勝于這種所謂的"方便".第一:數(shù)據(jù)導(dǎo)入不方便,經(jīng)常會(huì)有從另一系統(tǒng)導(dǎo)入數(shù)據(jù)進(jìn)來,自動(dòng)遞增的主鍵,將不允許原表中的ID被導(dǎo)入進(jìn)來.這會(huì)導(dǎo)致主鍵丟失.第二:對(duì)于象訂單這樣的有主外鍵的表來說,如果訂單的"主檔表"主鍵是自動(dòng)生成的.那么在保存一個(gè)訂單時(shí),會(huì)要求對(duì)主檔表與明細(xì)表同進(jìn)行事務(wù)保存,而此時(shí),先要生成一條訂單,然后取出這個(gè)訂單自動(dòng)生成的主鍵,然后再把此作為明細(xì)表的一個(gè)外鍵,進(jìn)行明細(xì)的保存.這過程中,將變以復(fù)雜而且不可行.事務(wù)如何處理.訂單主檔表插入記錄后,要是明細(xì)保存時(shí)遇到錯(cuò)誤,主檔表記錄還要進(jìn)行刪除.煩.插入成功以后,還要取出產(chǎn)生的最大值.這將是一個(gè)嚴(yán)重的浪費(fèi).記錄多的話會(huì)影響速度,而且會(huì)存在并行插入.導(dǎo)致獲取的記錄可能是不正確的. 因此在以上的嚴(yán)重問題下,請(qǐng)不要采用自動(dòng)遞增方式.
3.是否要采用int型作為主鍵
以前大家都采用int型,都是出來主鍵都是數(shù)字導(dǎo)致的.其實(shí)我們也明白.并不是只是數(shù)字的東西就是數(shù)字型的.比如電話號(hào)碼等.因此對(duì)于主鍵,采用int型的優(yōu)勢(shì)是速度快,插入,查詢時(shí)都可能會(huì)比其他的方式快.但我這種快的效果也未必有多明顯,比如以varchar(15)為例,物理主鍵排序的數(shù)據(jù),會(huì)自動(dòng)以主鍵進(jìn)行物理數(shù)據(jù)排序.因此,就算是字符型的數(shù)據(jù),在插入時(shí)也會(huì)插入到相應(yīng)的物理位置上,也就是說,在插入時(shí)可能會(huì)影響一些速度.但在以后的查詢中,速度影響不會(huì)太明顯.而我要說的,不采用int型作為主鍵,不是說,里面不存數(shù)據(jù).我還是建議大家在主鍵中存放數(shù)字,這樣的排序比較要比夾雜字母的排序來的快,之所以要采用字符型,也是為以后的數(shù)據(jù)導(dǎo)入作準(zhǔn)備,有一天,會(huì)要求從其他表導(dǎo)入數(shù)據(jù)時(shí),可以在導(dǎo)入數(shù)據(jù)的主鍵上加一個(gè)特定字母來避免與原主鍵沖突.比如在導(dǎo)入數(shù)據(jù)的主鍵前加一個(gè)"N"字母.這也就不用擔(dān)心,要求導(dǎo)入數(shù)據(jù)表中的主鍵是數(shù)字型還是字符型了.
4.是否采用編號(hào)來定義主鍵
這個(gè)問題是老生常談了.主鍵設(shè)計(jì)有個(gè)原則,就是主鍵不應(yīng)具有任何實(shí)際意義.這條其實(shí)是非常重要,有人就是覺得編號(hào)本身是唯一的,可以作為主鍵用,但可能會(huì)為以后帶來麻煩.因?yàn)閹в袑?shí)際意義的字段,還是存在被修改的可能性.而對(duì)于主鍵最大的忌諱就是修改主鍵,這可能會(huì)導(dǎo)致非常嚴(yán)重的不可估計(jì)的后果.比如學(xué)生編號(hào),平時(shí)以為永遠(yuǎn)不會(huì)修改,但修改的可能還是會(huì)存在.
還有一種,表面上是唯一的,但實(shí)際上應(yīng)該是允許重復(fù)的.我舉個(gè)例子,訂單吧,訂單編號(hào)應(yīng)該是唯一吧.是的.可是會(huì)存在這樣的情況,一張?jiān)瓉淼挠唵问且驗(yàn)槟硞€(gè)原因,要求訂單作廢.那好給訂單的狀態(tài)標(biāo)識(shí)為"cancel".然后允許再次錄入同樣編號(hào)的訂單.因此.對(duì)于這樣的情況下在,雖然有效的訂單編號(hào)只有一個(gè),但在數(shù)據(jù)庫(kù)角度會(huì)允許編號(hào)重復(fù).所以不管如何,還是建議大家為表都建一個(gè)沒有任何意義的主鍵,如ID.
因此,總結(jié)一下,我在設(shè)計(jì)主鍵,會(huì)采用字符型的.不采用自動(dòng)遞增,在新增記錄時(shí),系統(tǒng)生成主鍵值.一般為全數(shù)字進(jìn)行存入,至于主鍵值的生成規(guī)則,可以按需求進(jìn)行規(guī)則定義.如果沒有特殊的要求,只是為了保持唯一,可以定義一個(gè)字段存放一個(gè)數(shù)值.在生成時(shí),自動(dòng)加一.然后再存回去.這也比從一個(gè)表中尋找最大值要來的快吧.
轉(zhuǎn)載于:https://www.cnblogs.com/wala-wo/archive/2012/02/16/5119485.html
總結(jié)
- 上一篇: 异常(try...catch...fin
- 下一篇: 图解ecshop之批量上传与批量处理