數(shù)據(jù)庫系列 | MySQL設(shè)計三范式和反范式
Part1概述
為了建立冗余較小、結(jié)構(gòu)合理的數(shù)據(jù)庫,設(shè)計數(shù)據(jù)庫時必須遵循一定的規(guī)則。在關(guān)系型數(shù)據(jù)庫中這種規(guī)則就稱為范式。
范式是符合某一種設(shè)計要求的總結(jié)。要想設(shè)計一個結(jié)構(gòu)合理的關(guān)系型數(shù)據(jù)庫,必須滿足一定的范式。
【資料圖】
目前關(guān)系型數(shù)據(jù)庫有六種范式,分別為:
第一范式(1NF)第二范式(2NF)第三范式(3NF)第四范式(4NF)第五范式(5NF)第六范式(6NF)要求最低的范式是第一范式。第二范式在第一范式的基礎(chǔ)上又進一步的添加了要求,其余范式依次類推。
一般說來,數(shù)據(jù)庫只需滿足第三范式就行了,而通常我們用的最多的就是第一范式、第二范式、第三范式,也就是接下來要講的“三大范式”。
Part2第一設(shè)計范式
核心:確保每列保持原子性
第一范式是最基本的范式。如果數(shù)據(jù)庫表中的所有字段值都是不可分解的原子值,就說明該數(shù)據(jù)庫表滿足了第一范式。
第一設(shè)計范式要求表中字段都是不可再分的,如果實體中的某個屬性有多個值時,必須拆分為不同的屬性。
通俗理解即一個字段只存儲一項信息,如下圖所示,其中聯(lián)系方式可以拆分為手機、郵箱、固定電話,所以下圖不符合數(shù)據(jù)表第一設(shè)計范式要求:
糾正之后符合第一設(shè)計范式要求的如下圖所示:
Part3第二設(shè)計范式
第二設(shè)計范式要求表中必須存在業(yè)務(wù)主鍵,并且全部非主鍵依賴于業(yè)務(wù)主鍵,確保表中的每列都和主鍵相關(guān)。
第二范式(2NF)是在第一范式(1NF)的基礎(chǔ)上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。
第二范式(2NF)要求數(shù)據(jù)庫表中的每個實例或行必須可以被惟一地區(qū)分,為實現(xiàn)區(qū)分通常需要我們設(shè)計一個主鍵來實現(xiàn)(這里的主鍵不包含業(yè)務(wù)邏輯)。
即滿足第一范式前提,當(dāng)存在多個主鍵的時候,才會發(fā)生不符合第二范式的情況。比如有兩個主鍵,不能存在這樣的屬性,它只依賴于其中一個主鍵,這就是不符合第二范式。
通俗理解是任意一個字段都只依賴表中的同一個字段。(涉及到表的拆分)。如下圖數(shù)據(jù)表字段中 id 即為業(yè)務(wù)主鍵:
Part4第三設(shè)計范式
滿足第三范式(3NF)必須先滿足第二范式(2NF),簡而言之,第三范式(3NF)要求一個數(shù)據(jù)庫表中不包含已在其它表中已包含的非主鍵字段。就是說表的信息如果能夠被推導(dǎo)出來,就不應(yīng)該單獨的設(shè)計一個字段來存放(能盡量外鍵 join 就用外鍵 join)。很多時候我們?yōu)榱藵M足第三范式往往會把一張表分成多張表。
即滿足第二范式前提,如果某一屬性依賴于其他非主鍵屬性,而其他非主鍵屬性又依賴于主鍵,那么這個屬性就是間接依賴于主鍵,這被稱作傳遞依賴于主屬性。通俗解釋就是一張表最多只存兩層同類型信息。
如下圖所示的商品表不符合第三設(shè)計范式:
如圖所示,商品分類和分類描述字段冗余,每次添加相同分類商品都會使數(shù)據(jù)重復(fù),浪費存儲空間,可以將表拆分成如下三個表:
?
遵循數(shù)據(jù)表設(shè)計三范式可以避免字段值的重復(fù)存儲,提升存儲效率,節(jié)省存儲空間,將各個數(shù)據(jù)之間分的更細(xì),增加表的冗余性,為后期維護和拓展打下堅實的基礎(chǔ)。
高性能的 MySQL 數(shù)據(jù)庫第一步就是從數(shù)據(jù)表合理設(shè)計開始的。
Part5反范式化設(shè)計
沒有冗余的數(shù)據(jù)庫未必是最好的數(shù)據(jù)庫,有時為了提高運行效率,提高讀性能,就必須降低范式標(biāo)準(zhǔn),適當(dāng)保留冗余數(shù)據(jù)。
具體做法是:在概念數(shù)據(jù)模型設(shè)計時遵守第三范式,降低范式標(biāo)準(zhǔn)的工作放到物理數(shù)據(jù)模型設(shè)計時考慮。
降低范式就是增加字段,減少了查詢時的關(guān)聯(lián),提高查詢效率,因為在數(shù)據(jù)庫的操作中查詢的比例要遠(yuǎn)遠(yuǎn)大于 DML 的比例。但是反范式化一定要適度,并且在原本已滿足三范式的基礎(chǔ)上再做調(diào)整的。
如下圖所示,上面的例子可以稍微反范式化設(shè)計一下,可以減少實際數(shù)據(jù)查詢的連表查詢操作,提升效率:
Part6小結(jié)
際工作中,只要遵循數(shù)據(jù)庫設(shè)計第三范式要求即可,數(shù)據(jù)表的良好設(shè)計可以為今后更復(fù)雜的業(yè)務(wù)邏輯減少不必要的麻煩,適當(dāng)反范式化設(shè)計可以提升查詢效率和工作效率。
關(guān)鍵詞: