在關聯式資料庫的正規化理論中,正規化(Normalization)是一種將資料庫設計成一組滿足一定約束條件的表(Tables),以消除冗餘數據和避免數據異常的過程。正規化過程包括將資料表轉換為不同的正規型式(Normal Forms)。以下是將資料表轉換為第一正規型式(1NF)、第二正規型式(2NF)和第三正規型式(3NF)的過程說明。
定義: 一個資料表若滿足1NF,則其每個欄位(字段)都應該只包含原子值(即每個欄位的值是不可再分的)。
轉換過程:
示例: 假設有一個未正規化的學生課程表:
| 學生ID | 學生姓名 | 課程 |
|---|---|---|
| 1 | 王小明 | 數學, 英文 |
| 2 | 李大華 | 化學 |
| 3 | 張小英 | 數學, 物理 |
轉換為1NF:
| 學生ID | 學生姓名 | 課程 |
|---|---|---|
| 1 | 王小明 | 數學 |
| 1 | 王小明 | 英文 |
| 2 | 李大華 | 化學 |
| 3 | 張小英 | 數學 |
| 3 | 張小英 | 物理 |
定義: 一個資料表若滿足2NF,則其首先必須滿足1NF,並且每個非主鍵欄位都必須完全依賴於主鍵(即沒有部分依賴)。
轉換過程:
示例: 假設有一個1NF的學生課程表:
| 學生ID | 學生姓名 | 課程ID | 課程名稱 |
|---|---|---|---|
| 1 | 王小明 | C1 | 數學 |
| 1 | 王小明 | C2 | 英文 |
| 2 | 李大華 | C3 | 化學 |
| 3 | 張小英 | C1 | 數學 |
| 3 | 張小英 | C4 | 物理 |
在這個表中,「學生姓名」部分依賴於「學生ID」,「課程名稱」部分依賴於「課程ID」。
轉換為2NF:
學生表:
| 學生ID | 學生姓名 |
|---|---|
| 1 | 王小明 |
| 2 | 李大華 |
| 3 | 張小英 |
課程表:
| 課程ID | 課程名稱 |
|---|---|
| C1 | 數學 |
| C2 | 英文 |
| C3 | 化學 |
| C4 | 物理 |
學生課程關係表:
| 學生ID | 課程ID |
|---|---|
| 1 | C1 |
| 1 | C2 |
| 2 | C3 |
| 3 | C1 |
| 3 | C4 |
定義: 一個資料表若滿足3NF,則其首先必須滿足2NF,並且所有非主鍵欄位都必須直接依賴於主鍵(即沒有傳遞依賴)。
轉換過程:
示例: 假設有一個2NF的學生註冊表:
| 學生ID | 學生姓名 | 課程ID | 課程名稱 | 教授ID | 教授姓名 |
|---|---|---|---|---|---|
| 1 | 王小明 | C1 | 數學 | P1 | 李教授 |
| 1 | 王小明 | C2 | 英文 | P2 | 張教授 |
| 2 | 李大華 | C3 | 化學 | P3 | 王教授 |
| 3 | 張小英 | C1 | 數學 | P1 | 李教授 |
| 3 | 張小英 | C4 | 物理 | P4 | 陳教授 |
在這個表中,「教授姓名」傳遞依賴於「教授ID」。
轉換為3NF:
學生表:
| 學生ID | 學生姓名 |
|---|---|
| 1 | 王小明 |
| 2 | 李大華 |
| 3 | 張小英 |
課程表:
| 課程ID | 課程名稱 | 教授ID |
|---|---|---|
| C1 | 數學 | P1 |
| C2 | 英文 | P2 |
| C3 | 化學 | P3 |
| C4 | 物理 | P4 |
教授表:
| 教授ID | 教授姓名 |
|---|---|
| P1 | 李教授 |
| P2 | 張教授 |
| P3 | 王教授 |
| P4 | 陳教授 |
學生課程關係表:
| 學生ID | 課程ID |
|---|---|
| 1 | C1 |
| 1 | C2 |
| 2 | C3 |
| 3 | C1 |
| 3 | C4 |