【SQL正規化教學】完整解析1NF、2NF、3NF與BCNF,輕鬆理解資料庫設計規則

資料庫

在資料庫設計中,正規化(Normalization)是確保資料結構穩健與一致性的關鍵過程。透過正規化,可以消除資料冗餘、減少異常、提升查詢效能。以下將說明正規化的概念、各正規形式(Normal Forms)的定義,以及實務中的應用策略。


一、正規化的目的

  1. 消除資料冗餘。
  2. 避免插入、刪除與更新異常。
  3. 提升資料完整性與一致性。
  4. 簡化資料庫維護與擴展。

二、正規化的階段與正規形式

正規化過程通常依據正規形式進行,主要包含以下五個層級:

1. 第一正規形式(1NF)

  • 定義:資料表中所有欄位的值必須是不可再分的原子性資料。
  • 要點:消除重複欄位與多值欄位。

範例:

-- 非 1NF
| 顧客ID | 姓名 | 電話            |
|--------|------|-----------------|
| 001    | 王小明 | 0912-345678, 02-12345678 |

-- 轉為 1NF
| 顧客ID | 姓名 | 電話          |
|--------|------|---------------|
| 001    | 王小明 | 0912-345678  |
| 001    | 王小明 | 02-12345678  |

2. 第二正規形式(2NF)

  • 定義:符合 1NF,且非主鍵欄位必須完全依賴主鍵。
  • 要點:消除部分依賴性,避免部分主鍵影響非鍵屬性。

範例:

-- 非 2NF
| 訂單ID | 商品ID | 商品名稱 | 數量 |
|--------|--------|----------|------|
| 1001   | A001   | 鉛筆     | 2    |

-- 轉為 2NF
| 商品ID | 商品名稱 |
|--------|----------|
| A001   | 鉛筆     |

| 訂單ID | 商品ID | 數量 |
|--------|--------|------|
| 1001   | A001   | 2    |

3. 第三正規形式(3NF)

  • 定義:符合 2NF,且非主鍵欄位不得依賴其他非主鍵欄位。
  • 要點:消除傳遞依賴。

範例:

-- 非 3NF
| 學生ID | 系所代碼 | 系所名稱 |
|--------|----------|----------|
| S001   | CS01     | 資訊工程系 |

-- 轉為 3NF
| 系所代碼 | 系所名稱 |
|----------|----------|
| CS01     | 資訊工程系 |

| 學生ID | 系所代碼 |
|--------|----------|
| S001   | CS01     |

4. BCNF(Boyce-Codd Normal Form)

  • 定義:每個決定因素都是候選鍵。
  • 要點:解決 3NF 無法處理的複合候選鍵依賴問題。

5. 第四正規形式(4NF)

  • 定義:符合 BCNF,且無多值依賴。

6. 第五正規形式(5NF)

  • 定義:符合 4NF,且無連接依賴(Join Dependency)。

三、實務中正規化的取捨

  1. 一般情況下,3NF 足以滿足大多數業務需求。
  2. BCNF、4NF、5NF 適用於複雜關聯與資料一致性要求極高的情境。
  3. 過度正規化可能導致查詢效能下降,需要根據系統需求適度反正規化(Denormalization),以提升讀取速度。

四、正規化實務技巧

  1. 分析業務需求與資料流,確保關聯鍵設計合理。
  2. 優先實現 3NF,必要時視效能考量採取反正規化。
  3. 針對高頻率讀取操作,可考慮建立索引或物化檢視(Materialized View)。
  4. 定期審視資料庫設計,避免隨著業務變化導致資料結構混亂。

透過正規化分析與實務應用,能有效提升資料庫設計品質,確保資料一致性,並改善資料操作效能。在實務中應靈活運用正規化原則,結合業務特性與性能需求,打造高效且穩健的資料庫系統。

發佈留言