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















 
 
 








 
 
 
 