資料庫管理系統中的正規化
規範化是組織資料庫中資料以減少冗餘並提高資料一致性的過程。主鍵在組織資料庫中的資訊方面非常重要。它們有助於確保表中的每一行都有唯一的標識,從而避免任何資訊混淆或丟失。
在本文中,我們將討論資料庫規範化的不同正規化。
規範化
規範化是組織資料庫中資料以避免資料冗餘、插入異常、更新異常和刪除異常的過程。
規範化是組織資料庫中資料以最大限度地減少冗餘和依賴關係的過程。在資料庫設計中,根據表的主鍵存在不同的正規化。這些包括:
第一正規化 (1NF)
1NF 要求表中的每一列都包含原子值,並且每一行都有唯一的標識。這意味著表不能包含重複的組或陣列作為列,並且每一行都必須具有唯一的主鍵。
示例
如果每一列都包含原子值,並且每一行都有唯一的標識,則該表處於 1NF。例如,一個列出客戶及其電話號碼的表:
客戶ID |
姓名 |
電話號碼 |
|---|---|---|
1 |
John |
555-1234, 555-5678 |
2 |
Jane |
555-9876 |
3 |
Michael |
555-5555 |
這違反了 1NF,因為“電話號碼”列包含重複的組。
為了將此表規範化為 1NF,我們可以將“電話號碼”列拆分為單獨的行,並新增一個單獨的主鍵列:
客戶ID |
姓名 |
電話號碼 |
|---|---|---|
1 |
John |
555-1234 |
1 |
John |
555-5678 |
2 |
Jane |
555-9876 |
3 |
Michael |
555-5555 |
第二正規化 (2NF)
2NF 在 1NF 的基礎上,要求表中的每一列非主鍵列都完全函式依賴於主鍵。這意味著表不應該存在部分依賴,其中非主鍵列僅依賴於主鍵的一部分。
示例
如果每個非主鍵列都完全函式依賴於主鍵,則該表處於 2NF。例如,一個列出訂單及其明細項的表:
訂單ID |
客戶ID |
客戶姓名 |
商品ID |
商品名稱 |
數量 |
|---|---|---|---|---|---|
1 |
1 |
John |
1 |
襯衫 |
2 |
1 |
1 |
John |
2 |
褲子 |
1 |
2 |
2 |
Jane |
1 |
襯衫 |
1 |
2 |
2 |
Jane |
3 |
帽子 |
3 |
這違反了 2NF,因為“客戶姓名”列僅依賴於主鍵的一部分(客戶ID)。為了將此表規範化為 2NF,我們可以將其拆分為兩個表:
訂單ID |
客戶ID |
商品ID |
數量 |
|---|---|---|---|
1 |
1 |
1 |
2 |
1 |
1 |
2 |
1 |
2 |
2 |
1 |
1 |
2 |
2 |
3 |
3 |
客戶ID |
客戶姓名 |
|---|---|
1 |
John |
2 |
Jane |
第三正規化 (3NF)
3NF 在 2NF 的基礎上,要求表中的每一列非主鍵列都不傳遞依賴於主鍵。這意味著表不應該存在傳遞依賴,其中非主鍵列依賴於另一個非主鍵列。
示例
為了進一步解釋 3NF,讓我們考慮一個列出客戶訂單的表的示例:
訂單ID |
客戶ID |
客戶姓名 |
客戶城市 |
訂單日期 |
訂單總額 |
|---|---|---|---|---|---|
1 |
100 |
John Smith |
紐約 |
2022-01-01 |
100 |
2 |
101 |
Jane Doe |
洛杉磯 |
2022-01-02 |
200 |
3 |
102 |
Bob Johnson |
舊金山 |
2022-01-03 |
300 |
在此示例中,非主鍵列“客戶城市”傳遞依賴於主鍵。也就是說,它依賴於“客戶ID”(不是主鍵的一部分),而不是直接依賴於主鍵“訂單ID”。為了使此表達到 3NF,我們可以將其拆分為兩個表:
表 1:客戶
客戶ID |
客戶姓名 |
客戶城市 |
|---|---|---|
100 |
John Smith |
紐約 |
101 |
Jane Doe |
洛杉磯 |
102 |
Bob Johnson |
舊金山 |
表 2:訂單
訂單ID |
客戶ID |
訂單日期 |
訂單總額 |
|---|---|---|---|
1 |
100 |
2022-01-01 |
100 |
2 |
101 |
2022-01-02 |
200 |
3 |
102 |
2022-01-03 |
300 |
現在,“客戶城市”列不再傳遞依賴於主鍵,而是位於與主鍵具有直接關係的單獨表中。這使得表符合 3NF。
Boyce-Codd 正規化 (BCNF)
BCNF 是 3NF 的更嚴格形式,適用於具有多個候選鍵的表。BCNF 要求表中的每個非平凡依賴都是對候選鍵的依賴。這意味著表不應該存在非平凡依賴,其中非主鍵列依賴於另一個非主鍵列。BCNF 確保資料庫中的每個表都是一個單獨的實體,並消除了冗餘。
示例
如果每個決定因素都是候選鍵,則該表處於 BCNF。換句話說,表中的每個非平凡函式依賴都必須在候選鍵上。例如,考慮一個列出書籍及其作者資訊的表:
表:書籍
書籍ID |
書名 |
作者ID |
作者姓名 |
作者國籍 |
|---|---|---|---|---|
1 |
罪與罰 |
100 |
陀思妥耶夫斯基 |
俄羅斯 |
2 |
了不起的蓋茨比 |
101 |
F.斯科特·菲茨傑拉德 |
美國 |
3 |
傲慢與偏見 |
102 |
簡·奧斯汀 |
英國 |
在此示例中,“作者ID”和“作者姓名”之間的函式依賴違反了 BCNF,因為它不在候選鍵上。為了使此表達到 BCNF,我們可以將其拆分為兩個表:
表 1:作者
作者ID |
作者姓名 |
作者國籍 |
|---|---|---|
101 |
陀思妥耶夫斯基 |
俄羅斯 |
101 |
F.斯科特·菲茨傑拉德 |
美國 |
102 |
簡·奧斯汀 |
英國 |
表 2:書籍
書籍ID |
書名 |
作者ID |
|---|---|---|
1 |
罪與罰 |
100 |
2 |
了不起的蓋茨比 |
101 |
3 |
傲慢與偏見 |
102 |
現在,“作者姓名”和“作者國籍”列不再傳遞依賴於主鍵,並且該表處於 BCNF。
第四正規化 (4NF)
4NF 在 BCNF 的基礎上,要求表不應該存在多值依賴。當非主鍵列依賴於其他非主鍵列的組合時,就會發生多值依賴。例如,一個列出客戶訂單的表,其主鍵為訂單ID,非主鍵列為客戶ID和訂單項,違反了 4NF,因為訂單項依賴於訂單ID和客戶ID。
例如,一個列出訂單及其產品的表,其中包含訂單ID、產品ID和產品詳細資訊的列,違反了 4NF,因為產品詳細資訊依賴於訂單ID和產品ID的組合。
示例
考慮以下訂單和產品的表:
訂單ID |
產品ID |
產品名稱 |
產品描述 |
|---|---|---|---|
1 |
100 |
Widget |
紅色 Widget |
1 |
200 |
Widget |
藍色 Widget |
2 |
100 |
Widget |
紅色 Widget |
2 |
300 |
Thing |
綠色 Thing |
3 |
200 |
Widget |
藍色 Widget |
3 |
300 |
Thing |
綠色 Thing |
在此表中,產品名稱和描述都依賴於訂單ID和產品ID,從而產生多值依賴。為了使表達到 4NF,我們可以將其拆分為三個表:
訂單ID |
產品ID |
|---|---|
1 |
100 |
1 |
200 |
2 |
100 |
2 |
300 |
3 |
200 |
3 |
300 |
產品ID |
產品名稱 |
|---|---|
100 |
Widget |
200 |
Widget |
300 |
Thing |
產品ID |
產品描述 |
|---|---|
100 |
紅色 Widget |
200 |
藍色 Widget |
300 |
綠色 Thing |
規範化的優缺點
規範化的優點
減少資料冗餘
提高資料一致性
簡化資料庫維護
提高查詢效能
規範化的缺點
增加複雜性
降低讀取效能
提高寫入效能
增加儲存空間
過度規範化
結論
因此,我們已經解釋了資料庫管理系統 (DBMS) 中規範化的概念及其在資料管理中的重要性。我們涵蓋了資料庫規範化的不同正規化,包括 1NF、2NF、3NF、BCNF 和 4NF。我們解釋了規範化如何幫助消除資料冗餘、插入、更新和刪除異常。我們還提供了不同正規化中表的示例以及如何將其規範化為所需正規化的示例。我們已經撰寫了關於規範化在確保 DBMS 中資料一致性和準確性方面的重要性。
資料結構
網路
關係資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP