目錄
鍵和相關屬性的概念:
第一范式:
第二范式:
第三范式:
總結:
反范式化:
在關系型數據庫中,關于數據表設計的基本原則,規則就稱為范式。
范式是關系數據庫理論的基礎,也就是在設計數據庫結構過程中所要遵循的規則和指導方法。
關系數據庫常見的六種范式,按照范式級別從低到高是:第一范式、第二范式、第三范式、巴斯-科德范式、第四范式和第五范式(完美范式)。
范式的設計越高階,冗余度越低,同時高級的范式一定符合低階的范式要求。
有時候為了提高某些查詢性能,可能會破壞范式規則,也就是反規范化。
鍵和相關屬性的概念:
數據庫中的鍵右一個或者多個屬性組成。數據庫中常用的幾種鍵和屬性的定義。
超鍵:
能唯一標識一條記錄的任意屬性組合。
候選鍵:
不含多于屬性的最小超鍵,一個表可由多個候選鍵。
主鍵:
從候選鍵中選定,唯一標識記錄且不允許為空值。
外鍵:
關聯另一表主鍵的屬性,也就是在一個表中為主鍵,而在另一個表中為非主鍵。
唯一鍵:
保證列值唯一但允許為空,一個表可有多個唯一鍵。
索引:
提高查詢速度的數據結構。
主屬性:
包含在任一候選鍵中的屬性。
非主屬性:
不包含在任何候選鍵中的屬性。
第一范式:
第一范式主要是確保表中每個字段必須具有原子性,也就是每個字段不可再次拆分的最小數據單元。每個屬性必須具有單個值。能否拆分是具有主觀性的,根據需求來進行判斷。
第二范式:
第二范式要求,在滿足第一范式的基礎上,還需要滿足數據表里的每一條數據記錄,都是可唯一標識的。而且所有非主鍵字段,都必須完全依賴主鍵的所有屬性,不能只依賴主鍵的一部分。通過主鍵就能知道所有的對應行的的所有字段的值。每張表只能描述一種數據實體。
如果存在不完全依賴的字段可以將這些字段和依賴主關鍵字重新形成一個表。新表與舊表之間是一對多的關系。
第三范式:
第三范式在第二范式的基礎上,確保數據表中的每一個非關鍵字段都和主鍵字段直接相關,也就是數據表中所有非主鍵字段不能依賴于其他非主鍵字段。非主鍵之間不能有依賴關系,必須相互獨立。
總結:
第一范式(1NF):確保每列的值都是不可分割的原子值。確保每個字段只存儲一個值。
第二范式(2NF):在滿足第一范式的基礎上,確保每個非主屬性完全依賴于主鍵。消除部份依賴,確保數據的完整性。
第三范式(3NF):在滿足第二范式的基礎上,確保每個非主屬性不傳遞依賴于主鍵。消除傳遞依賴,確保數據的獨立性。
范式有助于消除數據庫中的數據冗余,但是有可能會降低查詢的效率,設計出的數據表越多,冗余度越低,在進行查詢時需要進行關聯多張表,可能會導致索引無效。
反范式化:
如果數據庫中數據量比較大,完全按照范式設計數據表,讀取數據會產生大量的關聯查詢,在一定程度上會影響數據庫的讀性能。可能會為了性能和讀取效率違反范式原則,通過增加少量的冗余來提高數據庫的讀性能,減少關聯查詢,實現空間換取時間的目的。
比如說:如果經常通過表A和表B通過關聯查詢查詢某個字段,那么可以在表A中添加這個字段,就不用進行關聯查詢。
反范式雖然能通過空間換時間,提升效率查詢,但是也會造成:
存儲空間變大。一個表中進行修改,另一個表中的冗余字段也需要進行修改。采用存儲過程來支持數據的更新、刪除等操作,會非常消耗系統資源。數據量小的情況下,不能體現出性能的優勢,反而會讓數據庫的設計更加復雜。
只有當冗余信息有價值或者能大幅度提升查詢效率,可以采取反范式進行優化。
在增加冗余字段時,盡量添加不需要經常修改且查詢時不可獲取。
注意:
在實際設計中需要權衡范式規范和查詢效率,所以根據數據量和查詢需求可以結合范式規范和反范式來設計表中的字段信息。