正規化的目的是通過結構化資料,消除冗餘和異常,確保數據的一致性和完整性。每個正規化形式(1NF、2NF、3NF、4NF)在不斷細化資料依賴關係,優化數據庫結構。
為何需要正規化?
正規化是指將關聯式資料庫中的資料組織成結構化形式的過程。其目的是:
- 減少數據冗餘:避免相同數據在多個表中重複出現。
- 消除資料異常:避免資料插入、更新和刪除異常,確保數據的一致性和完整性。
- 提高查詢效率:通過消除冗餘數據和確保數據依賴性的明確性,優化數據庫查詢。
第一正規化形式(1NF)
定義:
- 每個表格的欄位必須具有原子性,即每個欄位都只能包含單一值,不能有重複的數組或集合。
- 表格中的每一列必須是不可分割的單元。
示例:
- 非1NF:{學生ID, 學生姓名, 科目1, 科目2, ...}
- 1NF:{學生ID, 學生姓名, 科目},每行只包含一個科目。
第二正規化形式(2NF)
定義:
- 必須先滿足1NF。
- 所有非主鍵屬性都必須完全依賴於主鍵,而不能只依賴於主鍵的一部分(消除部分依賴性)。
示例:
- 非2NF:{學生ID, 科目, 科目名稱, 科目成績}
- 2NF:拆分成兩個表:
- {學生ID, 科目, 科目成績}
- {科目, 科目名稱}
第三正規化形式(3NF)
定義:
- 必須先滿足2NF。
- 所有非主鍵屬性都不能依賴於其他非主鍵屬性(消除傳遞依賴性)。
示例:
- 非3NF:{學生ID, 科目, 科目成績, 學院名稱, 學院地址}
- 3NF:拆分成三個表:
- {學生ID, 科目, 科目成績}
- {科目, 科目名稱}
- {學院名稱, 學院地址}
第四正規化形式(4NF)
定義:
- 必須先滿足3NF。
- 消除多重依賴性,即一個表格中不能存在非平凡且非函數依賴的多值依賴。
示例:
- 非4NF:{學生ID, 課程, 語言}
- 可能的多值依賴關係:學生可以修多門課程,且會說多種語言。
- 4NF:拆分成兩個表:
- {學生ID, 課程}
- {學生ID, 語言}