資料庫的「正規化」(Normalization)
正規化(Normalization)是指通過分解資料庫中的表格來消除資料冗餘,減少插入、更新和刪除操作中的異常,並提高資料的一致性和完整性。正規化的目的是將資料庫結構轉換為一組小的、更易於管理的表,每個表只包含相關的資料。正規化過程通常包括將資料庫轉換為若干正規化形式(Normal Forms,NFs),每個正規化形式都有具體的要求和規則。
正規化的主要步驟和形式
-
第一正規化形式(1NF):
- 要求:每個表格的每一列都是原子的(不可再分的),即每個欄位只包含單一值。
- 目的:消除重複的群組,確保每個欄位只有一個值。
-
第二正規化形式(2NF):
- 要求:首先符合1NF,並且每個非主鍵欄位都完全依賴於主鍵的全部,而不是部分。
- 目的:消除部分依賴,確保每個非主鍵欄位都依賴於主鍵的整體。
-
第三正規化形式(3NF):
- 要求:首先符合2NF,並且每個非主鍵欄位都只依賴於主鍵,而不依賴於其他非主鍵欄位。
- 目的:消除傳遞依賴,確保每個非主鍵欄位只依賴於主鍵。
BCNF(Boyce-Codd Normal Form)正規化形式
定義
BCNF(Boyce-Codd Normal Form)是一種比3NF更嚴格的正規化形式,旨在解決3NF無法處理的一些異常情況。BCNF的要求如下:
- 一個關係中的每個決定因素(determinant)都是候選鍵(candidate key)。
- 具體來說,如果關係 RRR 中存在函數依賴 X→YX \rightarrow YX→Y,則 XXX 應該是一個候選鍵。
BCNF 的要求和應用
- 候選鍵:候選鍵是一組能夠唯一標識關係中元組的屬性組合,且其中不包含多餘的屬性。
- 函數依賴:在關係 RRR 中,若屬性集 XXX 的值唯一地確定屬性集 YYY 的值,則稱 YYY 函數依賴於 XXX,記作 X→YX \rightarrow YX→Y。
- 應用:BCNF要求每個決定因素都是候選鍵,這意味著在BCNF中,每個非候選鍵的屬性都應該唯一地依賴於候選鍵,而不能依賴於其他非候選鍵的屬性。
示例
假設有一個表格 RRR,其結構如下:
| 學生ID(StudentID) |
課程ID(CourseID) |
教師(Teacher) |
|---|
| 1 |
CS101 |
Dr. Smith |
| 2 |
CS101 |
Dr. Smith |
| 3 |
CS102 |
Dr. Brown |
在這個例子中,假設有以下函數依賴:
- {學生ID,課程ID}→教師\{學生ID, 課程ID\} \rightarrow 教師{學生ID,課程ID}→教師
- 教師→課程ID教師 \rightarrow 課程ID教師→課程ID
雖然該表滿足3NF,但不滿足BCNF,因為 "教師" 不是候選鍵,卻決定了 "課程ID"。
為了使表格滿足BCNF,我們需要將其分解成兩個表格:
- 教師-課程表:
| 教師(Teacher) |
課程ID(CourseID) |
|---|
| Dr. Smith |
CS101 |
| Dr. Brown |
CS102 |
- 學生-教師表:
| 學生ID(StudentID) |
教師(Teacher) |
|---|
| 1 |
Dr. Smith |
| 2 |
Dr. Smith |
| 3 |
Dr. Brown |
分解後,兩個表都滿足BCNF的要求。
總結
- 正規化:通過將資料庫分解為更小的表,減少資料冗餘,提高資料的一致性和完整性。
- BCNF:比3NF更嚴格,要求每個決定因素都是候選鍵,進一步消除異常情況,提高資料庫設計的質量。