2009年3月17日 星期二

資料庫正規化

資料庫是存放資料的地方,如何妥善的規劃資料庫綱要 ( Database Schema ) 是一件很重要的事情。資料庫綱要的設計必須要配合企業實務上應用的需要,這裡先不討論在設計階段所需要注意的事項。

當資料庫綱要設計完成後,要如何檢視設計是否得當,這時候就需要使用正規化 ( Normal Form ) 的方法論了。對於有經驗的資料庫管理師,當資料庫綱要設計完成後,幾乎就符合實務上的需求,所以有很多人就忽略了正規化作業的處理。實際上經過正規化處理 的資料庫綱要,一般而言就可以達到優良資料庫綱要的最低標準,所以正規化的處理是有必要的。

正規化的目的是什麼呢,簡單的說就是避免資料重複的狀況發生,試想當客戶名稱出現在不同表格 ( Table ) 時,當客戶名稱變更時,必須同步更改數個表格,不僅會增加應用系統撰寫的負擔,同時也會增加資料庫的處理負擔,所以避免資料重複是一件很重要的工作。

相對的執行效能因為正規化的關係,會受到些許的影響。因為要取得相關資料的時候,必須到另一個表格才可以取得,當相對的表格數量很多的時候,就必 須花較長的時間才可以取得完整的資料。在一般的狀況下,屬於 OLTP 的系統就應該要做資料庫綱要正規化,如果是屬於 OLAP 的系統就視情況而定了。

正規化的步驟如下:

  1. 第一正規化 ( First Normal Form,簡稱 1NF ):由 E.F.Codd 提出。
  2. 第二正規化 ( Second Normal Form,簡稱 2NF ):由 E.F.Codd 提出。
  3. 第三正規化 ( Third Normal Form,簡稱 3NF ):由 E.F.Codd 提出。
  4. Boyce/Codd 正規化 ( Boyce/Codd Normal Form,簡稱 BCNF ):由 R.F. Boyce 與 E.F.Codd 共同提出。
  5. 第四正規化 ( Fourth Normal Form,簡稱 4NF ):由 R. Fagin 提出。
  6. 第五正規化 ( Fifth Normal Form,簡稱 5NF ):由 R. Fagin 提出。

在上述正規化的步驟中,後面的正規化一定會包含前面的正規化,例如符合 3NF 的資料庫綱要,一定會符合 1NF、2NF。

以下介紹 1NF、2NF、3NF、BCNF 的正規化的目的,如果不符合的話就必須將表格做適當的拆解,以符合每一個正規化的目的。由於不符合 4NF、5NF 的機會較低,在這裡就不多做介紹了。

第一正規化:每個一表格都會有一個 PK ( Primary Key ),同時每一個表格 ( Table ) 中的每一列 ( Row ) 的每一欄 ( Column ),都只能存放一個資料。

第二正規化:在表格中的每一個不是 PK 的欄位都只能與 PK 有相依性。

第三正規化:在表格中的每一個不是 PK 的欄位都必須與完整的 PK 有相依性。

BCNF:如果 PK 為單一欄位時,就不需要考慮這個狀況了。也就是當 PK 為複合欄位時,必須逐一檢視 PK 中每一個單獨的欄位是否與其他欄位有相依性的關係,如果有的話就必須進一步拆解表格。

本則專題由飛達客工作室提供