第三正規化和第二正規化不同的地方在於,在第三正規化裡,所有的非鍵屬性都必須和每個候選鍵有直接相關。如果再對第三正規化做進一步加強就成了BC正規化,它所強調的重點就在於 "資料間的關係是奠基在鍵上、以整個鍵為考量、而且除了鍵之外不考慮其他因素"。
以下面這個定義機械元件的關係為例:
元件編號 (主鍵) | 製造商名稱 | 製造商位址 |
---|---|---|
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) | 單價 (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 Orders.Total FROM Order" 就要改成用 "SELECT UnitPrice * Quantity FROM Order" 了)。
訂單編號 (Order Number) (主鍵) | 客戶名稱 (Customer Name) | 單價 (Unit Price) | 數量 (Quantity) |
---|---|---|---|
1000 | David | $35.00 | 3 |
1001 | Jim | $25.00 | 2 |
1002 | Bob | $25.00 | 3 |
沒有留言:
張貼留言