Normalization of Database——資料庫的正規化
Recall:
資料庫中的一些術語:(後面的中文可能翻譯不準確,我自己這麼稱呼它們)
relation
—— 關係模型
tuple
entity
—— 表中的一條記錄
,也成為實體
attribute/column
—— 每個表頭即屬性
domain
—— 屬性的取值域
FD(functional dependency)
—— 函式依賴
MVD(Multi-Valued Dependency)
—— 多值依賴。。這個真不知道該怎麼翻譯
Normalization of Database
資料庫正規化是資料庫中如何合理且有效組織資料的一門技術,它也為我們提供了一套系統地消除資料冗餘(redundancy)
異常(anomaly)
的方法。
正規化主要就是兩個目的:
- 消除資料冗餘(或者說沒意義的資料)
- 確保資料之間的依賴關係是合乎邏輯的
Problems Without Normalization
假如在設計資料庫關係的時候沒考慮正規化,不僅會因為資料間的冗餘從而浪費儲存空間,同時,它也會給我們更新、刪除資料時帶來很多麻煩,也就是上面說到的異常,下面舉例說明。
表頭分別是學生id,學生姓名,學生具體的專業方向,hod(Head of Department) 學院的領導,辦公電話。
插入異常
假如來了個新生,他還沒細分具體專業方向,於是乎在後三欄我們就沒辦法添了,只能用NULL來補充了,這樣就很不方便了;相反,假如軟體工程專業有50個學生,那麼這50個學生的後三欄就會重複,但我們不得不重複地插入。
更新異常
好,假如某天Mr. X不當領導了,然後換了個領導Mr. Y,那麼每個學生都需要將他的hod改成Mr. Y了。萬一資料庫管理員不小心漏了幾個同學的沒改,那這些學生的學籍就有錯誤了。
也許你會說:哎呀,那你管理員細心一點不就好了?
那我會說:你為什麼不可以換一種設計資料表的方式呢?
刪除異常
再假設,某個branch只有一個學生(好像不太可能),有一天,這個學生真的太孤單了,他讀不下去了,轉去學管理了,很顯然就要把他的資訊刪掉,問題就來了。因為我們的學生資訊和專業的資訊是綁在一起的,你刪了這個唯一的同學,那這個專業、專業領導也被你刪掉了,這樣就有問題了。
正規化的規則
主要分為以下幾種(越往後,要求越嚴格):
- First Normal Form
- Second Normal Form
- Third Normal Form
- BCNF(Boyce-Codd Normal Form)
- Fourth Normal Form
First Normal Form (1NF) 詳細介紹1NF
如果一個表是滿足一正規化的,那麼它需要滿足以下條件:
- 每個屬性的取值必須是原子的
atomic
- 每一列的
domain
必須是一樣的 - 不存在相同的列名
- 列的排列順序,以及每個tuple間的排列順序可以交換。
Second Normal Form (2NF) 詳細介紹2NF
如果一個表是滿足二正規化的,那麼它需要滿足以下條件:
- 它必須是滿足一正規化的
- 它不含有部分依賴(Partial Dependency)
Third Normal Form (3NF) 詳細介紹3NF
如果一個表是滿足三正規化的,那麼它需要滿足以下條件:
- 它必須是滿足二正規化的
- 它不含有傳遞依賴(TransitiveDependency)
Boyce and Codd Normal Form (BCNF) 詳細介紹BCNF
BCNF其實是第三正規化的更高約束版本,它可以處理一些3NF處理不了的異常 如果一個表是滿足BCNF的,那麼它需要滿足以下條件:
- 它必須是滿足三正規化的
- 對任意一個FD ( X → Y ), X應該是個
超鍵(superkey)
.
Fourth Normal Form (4NF) 詳細介紹4NF
如果一個表是滿足三正規化的,那麼它需要滿足以下條件:
- 它必須是滿足BCNF的
- 它不含有多值依賴( Multi-Valued Dependency.)
後面會持續更新。