關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)規(guī)范感悟
前言
在設(shè)計(jì)關(guān)系型數(shù)據(jù)庫(kù)時(shí),我們從課上的學(xué)習(xí)得知,需要參照不同的范式及原則,設(shè)計(jì)表結(jié)構(gòu)與表關(guān)系。在課上,我們關(guān)注的角度更多是,設(shè)計(jì)要符合范式,保證數(shù)據(jù)不冗余。但在實(shí)際的開發(fā)設(shè)計(jì)中,我們往往要從更多角度思考數(shù)據(jù)庫(kù)的設(shè)計(jì)原則,根據(jù)不同的需求場(chǎng)景,進(jìn)行不同角度的側(cè)重。比如開發(fā)是否便捷,表結(jié)構(gòu)是否易維護(hù),查詢效率是否達(dá)到要求等等。
設(shè)計(jì)原則
一般的企業(yè)級(jí)應(yīng)用數(shù)據(jù)庫(kù)中,對(duì)于數(shù)據(jù)的冗余是有一定容忍性的,但對(duì)于數(shù)據(jù)庫(kù)增刪改查的效率,往往會(huì)有很高的要求。這時(shí)候,我們之前遵循的一些原則,就要做出不同程度的改變。比如,之前依據(jù)少冗余原則,參考的設(shè)計(jì)三大范式,可能在數(shù)據(jù)庫(kù)增刪改查效率的面前,就要做一些妥協(xié)了。
在設(shè)計(jì)能容忍冗余、重視效率的數(shù)據(jù)庫(kù)時(shí),個(gè)人認(rèn)為,主要需要考慮以下幾方面:
1、每個(gè)表增刪改的范圍盡量都在本表進(jìn)行
這條原則也是與三大范式有些相悖的,但這樣做的好處非常明顯。
第一,還是從開銷角度出發(fā),這樣做的話,增刪改的開銷通常比多表要低。
第二,這樣便捷開發(fā),在數(shù)據(jù)存儲(chǔ)過(guò)程中,如果涉及多表操作,表越多,處理業(yè)務(wù)邏輯的代碼就越多,在開發(fā)時(shí)難度也就越大。
第三,可維護(hù)性高,這一點(diǎn)和第二點(diǎn)有點(diǎn)重合,但就是因?yàn)閱伪碓O(shè)計(jì)的業(yè)務(wù)代碼會(huì)相對(duì)簡(jiǎn)單,所以日后的維護(hù)也會(huì)相對(duì)容易,反之,多表的業(yè)務(wù)代碼龐雜,日后的維護(hù)也會(huì)非常的困難。
2、通過(guò)主鍵體現(xiàn)對(duì)應(yīng)關(guān)系,且應(yīng)體現(xiàn)流程順序
企業(yè)級(jí)應(yīng)用最大的難題就是梳理業(yè)務(wù),理清業(yè)務(wù)模塊之間的對(duì)應(yīng)關(guān)系。在數(shù)據(jù)庫(kù)中,表中包含的主鍵除了要體現(xiàn)對(duì)應(yīng)關(guān)系外,還應(yīng)該體現(xiàn)生成順序或流程順序的邏輯。
3、每個(gè)表盡量代表一個(gè)業(yè)務(wù)模塊,盡量記錄模塊中的所有字段
由第一個(gè)原則推理出這個(gè)原則,因?yàn)樵诒颈碓鰟h改查的開銷小,所以,如果一個(gè)表足夠的內(nèi)聚,那么這個(gè)表就要盡量記錄模塊中的所有字段。
tips:
如果之后業(yè)務(wù)模塊內(nèi)字段過(guò)多,可以進(jìn)行分表處理,但如果一開始就是分開設(shè)計(jì)的,那么處理會(huì)很麻煩。
4、中間表不可以隨意使用
在充分遵循三大范式的前提下,我們的設(shè)計(jì)就會(huì)有很多的中間表(關(guān)系表)。但如果在兩個(gè)表中,其中有一個(gè)表增刪改頻繁,那么從效率角度而言,這樣的設(shè)計(jì)就是不合格的。這樣的設(shè)計(jì)確實(shí)會(huì)減少很多數(shù)據(jù)冗余,但是也會(huì)大大增加每條數(shù)據(jù)增刪改的開銷。所以從一般的企業(yè)級(jí)應(yīng)用場(chǎng)景來(lái)看,中間表不可以隨意使用。
通過(guò)了解中間表的使用缺陷,我們也就知道了什么時(shí)候可以使用中間表。當(dāng)左表和右表都沒(méi)有非常頻繁的改動(dòng)需求,但有非常頻繁的聯(lián)表查詢需求的時(shí),我們就可以運(yùn)用中間表,來(lái)提升查詢效率,并減少數(shù)據(jù)冗余。
總結(jié)
經(jīng)過(guò)了幾次設(shè)計(jì)我發(fā)現(xiàn)一個(gè)大道理哈哈,其實(shí)技術(shù)最后還是要為具體的業(yè)務(wù)場(chǎng)景服務(wù)。很多計(jì)算機(jī)問(wèn)題都是需要時(shí)間和空間的開銷相互妥協(xié),在具體的業(yè)務(wù)場(chǎng)景中,往往也是如此。三大范式只是一般設(shè)計(jì)數(shù)據(jù)庫(kù)的基本理念,通過(guò)三大范式,我們可以建立一個(gè)小冗余、表結(jié)構(gòu)合理的數(shù)據(jù)庫(kù),但就像之前說(shuō)的,表結(jié)構(gòu)合理不代表符合業(yè)務(wù)需求,如有特殊業(yè)務(wù)情況,就要按特殊情況對(duì)待。
一般而言,需求 > 性能 > 表結(jié)構(gòu)(冗余)。