2007年9月10日 星期一

資料庫的三個正規化

單一欄位中有多個有意義的值
在單一欄位中存放多個值是違反第一正規化的做法,下面這個就是很好的例子,它把多個值用逗號分開來表示:
挑食列表
人 不喜歡的食物
Jim Liver, Goat's cheese
Alice Broccoli
Norman Pheasant, Liver, Peas
以這樣的設計看來,想要知道有什麼人不喜歡某樣特定的東西是很不容易的。不過可以把這個資料表轉化成下面這種符合第一正規化的型式:
挑食列表
人 不喜歡的食物
Jim Liver
Jim Goat's cheese
Alice Broccoli
Norman Pheasant
Norman Liver
Norman Peas
[編輯] 用很多欄位來表達同一個事實
在同一個資料表裡用多個欄位來表達同一個事情也是違反第一正規化的:
個人資料
人 喜歡的顏色 不喜歡的食物 (1) 不喜歡的食物 (2) 不喜歡的食物 (3)
Jim Green Liver Goat's cheese
Alice Fuchsia Broccoli
Norman Blue Pheasant Liver Peas
Emily Yellow
就算我們能確定每個人不喜歡吃的食物最多不會超過三樣,這還是一個很糟的設計。舉例來說,我們想要知道所有不喜歡同一種食物的人的組合的話,這就不是件容易的事,因為食物有可能出現在任何一個欄位,也就是說每一次的查詢都要去檢查 9 (3 x 3) 組不同的欄位組合。

第二正規化
維基百科,自由的百科全書
跳转到: 导航, 搜尋

第二正規化正在校對翻譯。
歡迎您積極參與校對與修訂,原文在en:Second normal form。


第二正規化 (2NF) 是資料庫正規化中所使用的一種正規形式。它的規則是要求資料表裡的所有資料都要和該資料表的主鍵有相依關係;如果有哪些資料只和主鍵的一部份有關的話,就得把它們獨立出來變成另一個資料表。如果一個資料表的主鍵只有單一一個欄位的話,它就一定符合第二正規化。
一個資料表符合第二正規化若且唯若
• 它符合第一正規化
• 所有非主鍵的欄位都一定和主鍵有關
範例
有一個資料表記錄了設備元件的資訊,如下所示:
元件來源
元件 ID (主鍵) 供應商 ID (主鍵) 供應商名稱 價格 供應商住址
65 2 Stylized Parts 59.99 VA
73 2 Stylized Parts 20.00 VA
65 1 ACME Industries 69.99 CA
這個資料表的每個值都是單一值,所以它符合第一正規化。因為同一個元件有可能由不同的供應商提供,所以得把元件 ID 和供應商 ID 合在一起組成一個主鍵。
主鍵和價格之間的關係很正確:同一個元件在不同供應商有可能會有不同的報價,所以價格確實和主鍵完全相關。
另一方面,供應商的名稱和住址就只和供應商 ID 有關,這不符合第二正規化的原則。仔細看就會發現 "Stylized Parts" 這個名稱和 "VA" 這個住址重複出現了兩次;要是它改名了或是被其他公司併購了怎麼辦?這時候最好把這些資料存到第二個資料表中:
供應商
ID 名稱 住址
1 ACME Industries CA
2 Stylized Parts VA
這麼一來,原本的 "元件來源" 資料表就得要做相對應的更動:
元件來源
元件 ID (主鍵) 供應商 ID (主鍵) 價格
65 2 59.99
73 2 20.00
65 1 69.99
檢查資料表裡的每個欄位,確認它們是不是都和主鍵完全相關,這樣才能知道這個資料表是不是符合第二正規化;如果不是的話,就把那些不完全相關的欄位移到獨立的資料表裡。接下來的步驟是要確保所有不是鍵的欄位都和彼此沒有相依關係,這就叫做第三正規化。

沒有留言: