第三范式(3NF)是資料庫正規化所使用的正規形式,要求所有非主鍵屬性都只和候選鍵有相關性,也就是說非主鍵屬性之間應該是独立無關的。

如果再對第三正規化做進一步加強就成了BC正規化,強調的重點在於「資料間的關係是奠基在主鍵上、以整個主鍵為考量、而且除了主鍵之外不考慮其他因素」。

正規定義

令:

  • 表一個關係;
  • 表維持 所需的一組函数依赖
  • 屬性的子集合
  • 的一個屬性

最早由埃德加·科德在1971年给出的第三范式定义为[1]

  • 关系R(表)满足第二范式 (2NF);
  • R的每个非键属性是R的每个候选键的非传递依赖。

Carlo Zaniolo于1982年给出的一个等价定义为[2][3]

如果對於 這種型式的函数依赖而言,下列敘述任一為真的話,則可以稱 符合第三正規化:

  • ;也就是說 明顯函数依赖
  • 超鍵
  • 候選鍵的一部份

任何一個具有部份相依性或是轉移相依性的關係都違反了第三正規化。

範例

以下面這個定義機械元件的關係為例:

更多信息 元件編號 (主鍵), 製造商名稱 ...
機械元件
元件編號
(主鍵)
製造商名稱 製造商地址
1000 Toyota Park Avenue
1001 Mitsubishi Lincoln Street
1002 Toyota Park Avenue
关闭

本例中製造商地址很明顯地不該被列在這個關係裡面,因為和元件本身比起來,製造商地址應該和製造商比較有關係;正確的做法應該是把獨立出新的資料表:

更多信息 製造商名稱 (主鍵), 製造商地址 ...
製造商
製造商名稱
(主鍵)
製造商地址
Toyota Park Avenue
Mitsubishi Lincoln Street
关闭

然後把原本的資料表改成這樣:

更多信息 元件編號 (主鍵), 製造商名稱 ...
機械元件
元件編號
(主鍵)
製造商名稱
1000 Toyota
1001 Mitsubishi
1002 Toyota
关闭

先前那個資料表的問題在於每提到一次製造商名稱就要多存一次它的地址,而這就不符合第三正規化的原則。

下面提供了另一個例子:

更多信息 訂單編號(Order Number) (主鍵), 客戶名稱 (Customer Name) ...
訂單 (Order)
訂單編號(Order Number)
(主鍵)
客戶名稱 (Customer Name) 單價 (Unit Price) 數量 (Quantity) 小計 (Total)
1000 David $35.00 3 $105.00
1001 Jim $25.00 2 $50.00
1002 Bob $25.00 3 $75.00
关闭

在本例中,非主鍵字段完全依賴于主鍵訂單編號,也就是說唯一的訂單編號能導出唯一非主鍵字段值,符合第二正規化。第三正規化要求非主鍵字段之間不能有依赖關係,顯然本例中小計依赖于非主鍵字段「單價」和「數量」,不符合第三正規化。小計不應該放在這個資料表裡面,只要把單價乘上數量就可以得到小計了;如果想要符合第三正規化的話,就把小計拿掉 (不過在做查詢時, SELECT Order.Total FROM Order 需改成 SELECT UnitPrice * Quantity FROM Order )。

更多信息 訂單編號(Order Number) (主鍵), 客戶名稱 (Customer Name) ...
訂單 (Order)
訂單編號(Order Number)
(主鍵)
客戶名稱 (Customer Name) 單價 (Unit Price) 數量 (Quantity)
1000 David $35.00 3
1001 Jim $25.00 2
1002 Bob $25.00 3
关闭

参考文獻

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.