資料庫正規化 (normalization)


資料庫正規化 (normalization)的定義: Database normalization is the process of organizing the fields and tables of a relational database to minimize redundancy and dependency. 資料庫正規化就是指把關聯式資料庫的欄位與表單做規劃,讓資料重覆性與相依性能夠降到最低。當然這個"資料重覆性與相依性能夠降到最低"情況下,還必須讓資料庫可以正常運作。

重複的資料會浪費磁碟空間,並產生維護方面的問題,不一致的相依性會讓資料出錯誤。

資料庫正規化有一些規則。每條規則都稱為「正規形式 Normal Form」。如果遵守第一條規則,資料庫就稱為屬於「第一正規形式」。如果遵守前三條規則,資料庫就被視為屬於「第三正規形式」。

雖然可能會有其他層級的正規形式,但第三正規形式被視為大部分應用程式所需的最高階正規形式。雖然有許多正式規則與規格,但真實情況不一定永遠完全都相同。一般而言,正規化需要其他資料表,有些客戶也會嫌麻煩。如果您決定違反正規化前三個原則中的其中一個原則,請確定您的應用程式能夠掌握所有可能發生的問題,例如重複的資料與不一致的相依性。

第一正規形式(1NF)
~刪除各個資料表中的重複群組。
~為每一組關聯的資料建立不同的資料表。
~使用主索引鍵識別每一組關聯的資料。

以下是違反第一正規形式的例子:
table_employee (empid, empname, empaddress1, empaddress2)
類似的資料有多個欄位 empaddress1, empaddress2

上面這個例子,如果需要再輸入某個員工的第三個地址,就沒有辦法。

再如下圖的資料表,數量欄位內有多筆資料,也就是重複群存在數量欄位內,也是違反第一正規形式的例子。


上面這個例子,有沒有辦法知道某個顧客,在特定日期交易數量是多少? 因為有許多筆資料
無法確實知道哪個數量才是答案。

再如下圖的資料表,缺乏唯一識別碼,也是違反第一正規形式的例子。






上面這個例子,Pete在Monday有多筆交易,但是無法知道上面這兩筆是重複資料? 還是兩筆不同交易? 如果是兩筆不同交易,卻無法辨識出來。


其實第一正規形式,就是在去除重覆性的問題。


更多參考:
http://zh.wikipedia.org/wiki/%E7%AC%AC%E4%B8%80%E8%8C%83%E5%BC%8F

第二正規形式(2NF)
~為可套用於多筆記錄的多組值建立不同的資料表。
~使用外部索引鍵,讓這些資料表產生關聯。

以下是違反第二正規形式的例子:

以上的表單中,主鍵是[元件ID+供應商ID],而供應商名稱與供應商ID相依,但是與元件ID卻沒有相依,這種欄位中有部分相依於主鍵,就不符合第二正規形式。

什麼叫做供應商名稱與元件ID沒有相依? 意思是元件ID不能決定是哪個供應商名稱,也就是之間沒有關聯。

所以上面這個表單,必須拆解為如下的表單:



其實第二正規形式,就是在去除部分功能相依的問題。

更多參考:
http://zh.wikipedia.org/wiki/%E7%AC%AC%E4%BA%8C%E8%8C%83%E5%BC%8F

第三正規形式
~刪除不依賴索引鍵的欄位。

以下是違反第三正規形式的例子:


以上的表單中,製造商位址顯然是跟製造商有關係,而跟主鍵沒有關係。

其實第三正規形式,就是在去除遞移相依的問題。

更多參考:
http://zh.wikipedia.org/wiki/%E7%AC%AC%E4%B8%89%E8%8C%83%E5%BC%8F

範例: 現在有下圖的表單,應該怎麼規劃才能夠符合3NF呢?




「Boyce Codd 正規形式」
(BCNF)又稱3.5NF;如果資料表的主鍵是由多個欄位組成的,則必須再執行 Boyce-Codd 正規化。如果資料表的主鍵僅是單欄位組成,就不需要進行BCNF。

符合Boyce-Codd 正規化的形式 (Boyce-Codd Normal Form, 簡稱 BCNF):
~符合 3NF 的格式。
~各欄位與主鍵沒有間接相依的關係。
~主鍵中的各欄位不可以相依於其他非主鍵的欄位。

例如下圖,PK為[StudentID+Course]
StudentID與Course決定對應的duration,但是name與Course也可以決定對應的duration
(其實這裡把name改為StudentNo,可能比較好),並不符合BCNF。


下圖才是符合BCNF。也就是拆解為student_info與student_course兩個表單。



第四正規形式
~符合BCNF
~去除多值屬性(MVD,Multi Value Dependency)

例如:一門課可能由多位講師授課,每一門課可以使用多本教課書,儲存這些資料如下

上述相依關係就是「多重值相依」(Multi-valued Dependency),以雙箭頭表示寫成: course→textbook,course→instructor ,因此增加textbook,就必須也加入instructor,增加instructor,就必須也加入textbook。

原資料表必須改成如下,才是符合4NF。




張貼留言

0 留言