1. 程式人生 > >Normalization of Database——資料庫的正規化

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

如果一個表是滿足一正規化的,那麼它需要滿足以下條件:

  1. 每個屬性的取值必須是原子的atomic
  2. 每一列的domain必須是一樣的
  3. 不存在相同的列名
  4. 列的排列順序,以及每個tuple間的排列順序可以交換。

Second Normal Form (2NF) 詳細介紹2NF

如果一個表是滿足二正規化的,那麼它需要滿足以下條件:

  1. 它必須是滿足一正規化的
  2. 它不含有部分依賴(Partial Dependency)

Third Normal Form (3NF) 詳細介紹3NF

如果一個表是滿足三正規化的,那麼它需要滿足以下條件:

  1. 它必須是滿足二正規化的
  2. 它不含有傳遞依賴(TransitiveDependency)

Boyce and Codd Normal Form (BCNF) 詳細介紹BCNF

BCNF其實是第三正規化的更高約束版本,它可以處理一些3NF處理不了的異常 如果一個表是滿足BCNF的,那麼它需要滿足以下條件:

  1. 它必須是滿足三正規化的
  2. 對任意一個FD ( X → Y ), X應該是個超鍵(superkey).

Fourth Normal Form (4NF) 詳細介紹4NF

如果一個表是滿足三正規化的,那麼它需要滿足以下條件:

  1. 它必須是滿足BCNF的
  2. 它不含有多值依賴( Multi-Valued Dependency.)

後面會持續更新。