回到基礎 - 資料庫正規化

Back to base - database normalization

資料庫正規化,是設計資料庫的一系列原理,以減少資料庫中資料的冗餘和提升資料的一致性。主要用於關聯式資料庫上,最初由 Edgar F. Codd 所提出。從最初的 UNF 一直到現在的 6NF總共有 11 個階段,但是大部分只會用到 3NF。因為過度的正規化,會造成資料庫的操作複雜性提高很多,所以還是要考量實務上的需求,做不到不同程度的正規化。

以下是擷取自 Wiki 的不同正規化的原則:

正規化階層表

1NF: First normal form 第一正規化

主要原則增加了欄位原子性,每個欄位的值都只有一個值,並且所有欄位都是依賴於 Primary key。 例如每個班級的學生名字都不會有多個,而且名字和性別都是依賴於學號一樣。

還未正規化的資料,可以看到課程名稱和成績都是複數的值。

學號姓名性別課程名稱成績
001AmyFemaleDesign, PE15, 14
002DavidMaleDesign, PE11, 24

正規化後

學號姓名性別課程名稱成績
001AmyFemaleDesign15
001AmyFemalePE14
002DavidMaleDesign11
002DavidMalePE24

2NF: Second normal form 第二正規化

主要原則增加了每個欄位值都相依於 Primary key,只有當 Pimary key 是複數欄位組成時,才能是部分相依。例如學號跟課程名稱是沒有關係的,進行第二正規化後會變成:

學號姓名性別
001AmyFemale
002DavidMale
學號課程代碼成績
001C00145
002C00214
課程代碼老師編號課程名稱老師名稱
C001T1DesignMv
C002T2PEZd

3NF: Third normal form 第三正規化

Table 中不能有間接依賴,例如老師名稱和課程代碼沒有相關,但是跟老師編號有相關。那老師名稱跟課程代碼就是有間接相依。 第三正規化就是在做拆分,將兩個資料表用 Foreign key 做連結。

課程代碼課程名稱老師編號
C001DesignT1
C002PET2
老師編號老師名稱
T1Mv
T2Zd

EKNF: Elementary key normal form 主鍵正規化

沒找到很好清楚的解釋

BCNF: Boyce–Codd normal form Boyce-Codd 正規化

由 Boyce 和 Codd 在 1974 年所提出的 3NF 改良版,比 3NF 更嚴苛。如果 Primary key 是由多個欄位組成時,就必須執行 BCNF。其除了 Primary key 之外的欄位,不可以依賴於其他非 Primary key 的欄位。

4NF: Fourth normal form 第四正規化

主要著重在組合 primary key 的使用

Primary key 由三個欄位組成,但是可以發現有很多重複的地方。Pizza Variety 和 Delivery Area 都只跟 Restaurant 有相依,但是彼此沒有相關。這種情況下,就會需要進行 4NF。 要符合 4NF 的話就要再拆分

RestaurantPizza VarietyDelivery Area
A1 PizzaThick CrustSpringfield
A1 PizzaThick CrustShelbyville
A1 PizzaThick CrustCapital City
A1 PizzaStuffed CrustSpringfield
A1 PizzaStuffed CrustShelbyville
A1 PizzaStuffed CrustCapital City
Elite PizzaThin CrustCapital City
Elite PizzaStuffed CrustCapital City
Vincenzo's PizzaThick CrustSpringfield
Vincenzo's PizzaThick CrustShelbyville
Vincenzo's PizzaThin CrustSpringfield
Vincenzo's PizzaThin CrustShelbyville

經過 4NF 之後

RestaurantPizza Variety
A1 PizzaThick Crust
A1 PizzaStuffed Crust
Elite PizzaThin Crust
Elite PizzaStuffed Crust
Vincenzo's PizzaThick Crust
Vincenzo's PizzaThin Crust
RestaurantDelivery Area
A1 PizzaSpringfield
A1 PizzaShelbyville
A1 PizzaCapital City
Elite PizzaCapital City
Vincenzo's PizzaSpringfield
Vincenzo's PizzaShelbyville

ETNF: Essential tuple normal form 關鍵元祖正規化

Every join dependency has a superkey component 每個 join 的相依都需要有個 foreign key。 個人覺得簡單的解釋就是,在我們所謂的關聯表中,除了 foreign key 之外不加入其他欄位。

Supplier IDTitleFranchisee ID
1Beginning MySQL Database Design and Optimization1
2The Relational Model for Database Management: Version 22
3Learning SQL3

經過 ETNF 後,拆分成三張表

Supplier IDTitle
1Beginning MySQL Database Design and Optimization
2The Relational Model for Database Management: Version 2
3Learning SQL
TitleFranchisee ID
Beginning MySQL Database Design and Optimization1
The Relational Model for Database Management: Version 22
Learning SQL3
Supplier IDFranchisee ID
11
22
33

5NF: Fifth normal form 第五正規化

Every join dependency has only superkey components

DKNF: Domain-key normal form 域鍵正規化

著重在於 constraint

6NF: Sixth normal form 第六正規化

Reference

Did you find this article valuable?

Support 攻城獅 by becoming a sponsor. Any amount is appreciated!