數據庫規范化與范式
數據庫設計中的規范化旨在減少數據冗余,增強數據完整性,避免數據異常(如插入、更新、刪除異常)。這通過將大型數據表分解成更小、更易管理的表,并定義它們之間的關系來實現。
不同的范式代表不同的規范化級別,每個級別都建立在前一個級別的基礎上,并遵循特定的規則。以下是幾種常用的范式:
第一范式 (1NF)
1NF 是規范化的基礎級別,其核心目標是消除重復數據,確保表中每個字段都包含單個、不可分割的值(原子值)。
- 1NF規則:
- 每個字段必須包含原子值,即不可再細分的值。
- 每行數據必須唯一。
- 每列數據類型一致。
- 不允許出現重復的列或字段內包含多個值。
1NF示例:
非1NF:
訂單ID | 商品 | 數量 |
---|---|---|
1 | 蘋果,香蕉 | 2,3 |
2 | 橙子 | 5 |
—
轉換為1NF:
訂單ID | 商品 | 數量 |
---|---|---|
1 | 蘋果 | 2 |
1 | 香蕉 | 3 |
2 | 橙子 | 5 |
—
第二范式 (2NF)
2NF 在1NF的基礎上,進一步消除了部分函數依賴。部分函數依賴是指非主鍵屬性依賴于主鍵的一部分(對于復合主鍵)。要滿足2NF,必須先滿足1NF。
- 2NF規則:
- 滿足1NF。
- 每個非主鍵屬性必須完全依賴于整個主鍵。
2NF示例:
非2NF(部分函數依賴):
訂單ID | 商品 | 客戶姓名 | 價格 |
---|---|---|---|
1 | 蘋果 | John | 10 |
1 | 香蕉 | John | 5 |
2 | 橙子 | Jane | 8 |
—
轉換為2NF:
表:
- 訂單 (訂單ID, 客戶姓名)
- 訂單明細 (訂單ID, 商品, 價格)
訂單表:
訂單ID | 客戶姓名 |
---|---|
1 | John |
2 | Jane |
—
訂單明細表:
訂單ID | 商品 | 價格 |
---|---|---|
1 | 蘋果 | 10 |
1 | 香蕉 | 5 |
2 | 橙子 | 8 |
—
第三范式 (3NF)
3NF 在2NF的基礎上,消除了傳遞函數依賴。傳遞函數依賴是指非主鍵屬性依賴于其他非主鍵屬性。要滿足3NF,必須先滿足2NF。
- 3NF規則:
- 滿足2NF。
- 任何非主鍵屬性都不應依賴于其他非主鍵屬性。
3NF示例:
非3NF(傳遞函數依賴):
訂單ID | 商品 | 類別 | 供應商 |
---|---|---|---|
1 | 蘋果 | 水果 | XYZ |
2 | 胡蘿卜 | 蔬菜 | ABC |
—
轉換為3NF:
表:
- 訂單 (訂單ID, 商品, 類別)
- 類別 (類別, 供應商)
訂單表:
訂單ID | 商品 | 類別 |
---|---|---|
1 | 蘋果 | 水果 |
2 | 胡蘿卜 | 蔬菜 |
—
類別表:
類別 | 供應商 |
---|---|
水果 | XYZ |
蔬菜 | ABC |
—
Boyce-Codd范式 (BCNF)
BCNF 比3NF更嚴格。如果每個函數依賴的左部都是候選鍵,則表滿足BCNF。
- BCNF規則:
- 滿足3NF。
- 每個決定因素都是候選鍵。
第四范式 (4NF)
4NF 解決了多值依賴問題,即一個屬性決定另一個屬性的多個值,且這些值彼此獨立。
- 4NF規則:
- 滿足BCNF。
- 沒有多值依賴。
總結
數據庫規范化是確保數據質量的關鍵步驟。不同的范式提供了不同級別的規范化,選擇合適的范式需要權衡數據完整性和性能需求。 雖然高范式能保證數據完整性,但在某些情況下,為了性能考慮,可能會選擇降低范式級別。