數(shù)據(jù)庫作為目前收集、存儲(chǔ)數(shù)據(jù)信息的重要平臺(tái),在信息爆炸的當(dāng)今時(shí)代,其作用和價(jià)值也日益凸顯。那么設(shè)計(jì)數(shù)據(jù)庫時(shí)應(yīng)該注意哪些問題呢,中培偉業(yè)“大數(shù)據(jù)”專家鐘老師在這里就事務(wù)型數(shù)據(jù)庫設(shè)計(jì)過程中應(yīng)注意的問題進(jìn)行了解答。
1.是否使用聯(lián)合主鍵?
采用聯(lián)合主鍵是比較理想的選擇。因?yàn)檫@樣會(huì)降低索引的效率,聯(lián)合主鍵一般都要用到至少一個(gè)業(yè)務(wù)字段,往往是字符串型的,而且理論上多字段的索引比單字段的索引要慢些??瓷先ニ坪跻膊荒敲辞逅?
在實(shí)際的設(shè)計(jì)中,我盡量避免使用聯(lián)合主鍵,有些時(shí)候“不得不”使用聯(lián)合主鍵。
2.PK采用無意義的字段(邏輯主鍵)還是有意義的字段(業(yè)務(wù)主鍵)?
“邏輯主鍵”應(yīng)該,理由是這樣設(shè)計(jì)出的數(shù)據(jù)庫模型結(jié)構(gòu)清晰、關(guān)系脈絡(luò)清楚,往往更符合“第三范式”(雖然不是故意的,呵呵)。而且更容易避開“聯(lián)合主鍵”,而且可以使用索引效率高的字段類型,比如intlongnumber。缺點(diǎn)是用無意義的字段建立表間的關(guān)系,使跨表查詢?cè)龆啵氏陆怠#軣o處不在,前面剛說完可以提高效率,這里馬上又降低效率)?!皹I(yè)務(wù)主鍵”可以提升查詢編碼的簡(jiǎn)潔度和效率。
總體來說“邏輯主鍵”比“業(yè)務(wù)主鍵”執(zhí)行效率低,但不會(huì)低到無法滿足需求。采用“邏輯主鍵”比采用“業(yè)務(wù)主鍵”更利于數(shù)據(jù)庫模型的結(jié)構(gòu)、關(guān)系清晰,也更便于維護(hù)。
對(duì)于分析型數(shù)據(jù)庫,如數(shù)據(jù)倉庫,千萬不要這樣做。
3.不要使用多對(duì)多關(guān)系?
少使用多對(duì)多關(guān)系。這個(gè)問題其實(shí)不是數(shù)據(jù)庫設(shè)計(jì)的問題了,在數(shù)據(jù)庫設(shè)計(jì)中,多對(duì)多關(guān)系也僅僅存在于邏輯模型(E-R)階段,物理模型不在有多對(duì)多關(guān)系,實(shí)際數(shù)據(jù)庫中也不會(huì)有“多對(duì)多”關(guān)系。這是使用ORM時(shí)的問題,比如使用Hibernate,多對(duì)多關(guān)系有時(shí)會(huì)使編碼看起來靈活一些,代價(jià)是效率的明顯降低。
設(shè)計(jì)時(shí)基本不考慮多對(duì)多關(guān)系,但編碼時(shí)總會(huì)有小組成員使用一些多對(duì)多關(guān)系,自己建立多對(duì)多的ORM,使自己編碼方便些,用在數(shù)據(jù)量小的地方,影響不大。大數(shù)據(jù)量,則“禁止使用”。
4.為每個(gè)表增加一個(gè)state字段?
設(shè)計(jì)時(shí)給每個(gè)表設(shè)一個(gè)state字段,取值,默認(rèn)值為,具體業(yè)務(wù)意義或操作上的意義可以自定義??梢宰鳛橐粋€(gè)狀態(tài)控制字段,如查詢、更新、刪除條件,單據(jù)是否有效(業(yè)務(wù)單據(jù)對(duì)應(yīng)的表會(huì)有業(yè)務(wù)意義上的“有無效”或“狀態(tài)”字段,這種情況下,我還是會(huì)再加一個(gè)state字段),甚至僅僅是控制一條數(shù)據(jù)是否“有效”(有效的意義你自己定)。在數(shù)據(jù)遷移(如轉(zhuǎn)入分析用的數(shù)據(jù)庫)時(shí)也可能會(huì)發(fā)揮作用。
5.為每個(gè)表設(shè)置一些備用字段?
沒辦法,我總是設(shè)計(jì)不出“完美”的數(shù)據(jù)表,給每個(gè)表加幾個(gè)備用字段(我一般用字符串型,隨你)可以應(yīng)付“不時(shí)之需”,尤其是需要長期維護(hù)的、業(yè)務(wù)可能有臨時(shí)性變動(dòng)的系統(tǒng)。
6.盡量不要在一個(gè)表中存入其關(guān)聯(lián)表的字段?
建議不存!這樣做確實(shí)可以提高查詢效率,但在一個(gè)有很多表,并且關(guān)聯(lián)表多的情況下,很難保持?jǐn)?shù)據(jù)的一致性!數(shù)據(jù)庫結(jié)構(gòu)也比較糟糕。而且不存,也不會(huì)使效率十分低下。
7.不要去直接修改數(shù)據(jù)庫?
這點(diǎn)很重要,當(dāng)需要修改時(shí),應(yīng)該先去修改模型,然后同步物理數(shù)據(jù)庫,尤其是團(tuán)隊(duì)開發(fā),否則要多做更多的事情來搞定,也可能會(huì)引入更多的錯(cuò)誤。