一、數據庫設計的重要性:
1.糟糕的數據庫設計產生的問題:
(1)數據冗余、信息重復、存儲空間浪費
(2)數據更新、插入、刪除的異常
(3)無法正確表示信息
(4)丟失有效信息
(5)程序性能差
2.良好的數據庫設計有以下優點:
(1)節省數據的存儲空間
(2)能夠保證數據的完整性
(3)方便進行數據庫應用系統的開發
二、范式
1.范式簡介:
在關系型數據庫中,關于數據表設計的基本原則、規則稱為范式,可以理解為一張數據表的設計結構需要滿足的某種設計標準的級別。范式時關系型數據庫理論的基礎,時在設計數據庫結構中所要遵循的規則和指導方法。
2.范式的種類:
按照范式級別,范式從低到高分別是:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯—科德范式(BCNF),第四范式(4NF)和第五范式(5NF)。數據庫的范式設計越高階,冗余度就越低,同時高階的范式一定符合低階范式的要求,滿足最低要求的范式是第一范式,在第一范式的基礎上進一步滿足更多規范要求的稱為第二范式,其余范式以此類推。一般來說在關系型數據庫的設計中最高要達到BCNF,普遍還是3NF。有時為了提高查詢性能還要破壞范式化。
3.鍵和相關屬性概念:
(1)超鍵:能夠唯一標識元組的屬性集稱為超鍵
(2)候選鍵:如果超鍵不包括多余的屬性,那么這個超鍵就是候選鍵
(3)主鍵:從候選鍵中選擇一個作為主鍵
(4)外鍵:如果數據表R1中的某屬性集不是R1的主鍵,而是另一個數據表R2的主鍵,那么這個屬性集就是數據表R1的外鍵
(5)主屬性:包含在任一候選鍵中的屬性
(6)非主屬性:不包含在任一候選鍵中的屬性。
4.第一范式(1st NF):第一范式主要是確保數據表中的每個字段的值必須具有原子性,也就是說數據表中的每個字段的值為不可拆分的最小單元。
5.第二范式(2NF):在滿足第一范式的基礎上,還要滿足數據表中的每一條記錄都是唯一可以標識的,而且所有的非主鍵字段都必須完全依賴于主鍵,不能只依賴主鍵的一部分。也就是如果知道主鍵的所有屬性的值,就可以檢索到任何元組的任何屬性的任何值。2NF要求實體的屬性集完全依賴于主關鍵字,如果不存在完全依賴,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體和原實體之間是一對多的關系。
6.第三范式(3NF):在滿足第二范式的基礎上確保數據表中的每一個非主鍵字段都和主鍵字段直接相關,也就是說要求數據表中的所有非主鍵字段不能依賴于其他非主鍵字段。也就是說所有非主鍵屬性之間必須相互獨立。
第一范式確保每列的原子性,數據庫的每一項都是不可分割的原子數據項,不可再分的最小數據單元,而不能是集合、數組、記錄等非原子數據項。第二范式確保每列都和主鍵完全依賴,尤其在復合主鍵的情況下,非主鍵部分不應該依賴于部分主鍵。第三范式確保每列都和主鍵列直接相關,而不是間接相關。
7.巴斯范式(BCNF):BCNF被稱為是修正的第三范式或擴充的第三范式,若一個第三范式只有一個候選鍵并且它的每個候選鍵都是單屬性,那么該關系自然到達BCNF。
8.第四范式:第四范式是在BCNF的基礎上消除非平凡且非函數依賴的多值依賴(即把同一表內的多對多關系刪除)
多值依賴:屬性之間的一對多關系,記為k→→A。
函數依賴:實際上是單值依賴,不能表達屬性值之間的一對多關系
平凡的多值依賴:全集U=K+A,一個K可以對應多個A,即k→→A,此時整個表就是一組一對多關系
非平凡的多值依賴:全集U=K+A+B,一個K可以對應于多個A,也可以對應于多個B,A與B互相獨立
范式的優點:數據的標準化有助于消除數據庫中的數據冗余,3NF被認為在性能、擴展性和數據完整性方面達到了最好的平衡。
范式的缺點:范式可能降低查詢的效率,因為范式等級越高,設計出的數據表越多、越精細、數據冗余度就越低,進行數據查詢的時候就可能需要關聯多張表,也可能導致索引失效。
三、反范式化:
1.概述:
有的時候不能簡單按照規范要求設計數據表,因為有的數據看似冗余,其實對業務來說十分重要。這個時候,就要遵循業務優先的原則,首先滿足業務需求,再盡量減少冗余。如果數據庫中的數據量比較大,系統的UV和PV訪問頻次比較高,則完全按照MySQL的三大范式設計數據表,讀數據時會產生大量的關聯查詢,在一定程度上會影響數據庫的讀性能。如果想對查詢效率進行優化,反范式優化也是一種優化思路。此時可以通過在數據表中增加冗余字段來提高數據庫的讀性能。
2.反范式化帶來的問題:
(1)存儲空間變大
(2)一個表中的字段做了修改,另一個表中的冗余字段也需要同步修改,否則數據不一致
(3)若采用存儲過程來支持數據的更新、刪除等額外操作,如果頻繁更新會非常消耗系統資源
(4)在數據量小的情況下反范式化可能會讓數據庫設計更加復雜
3.反范式化應用場景:
(1)增加冗余字段的建議:這個冗余字段不需要經常修改或者查詢時不可或缺
(2)歷史快照、歷史數據的需要