Skip to main content

Command Palette

Search for a command to run...

回到基礎 - 資料庫正規化

Back to base - database normalization

Published

資料庫正規化,是設計資料庫的一系列原理,以減少資料庫中資料的冗餘和提升資料的一致性。主要用於關聯式資料庫上,最初由 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

  • https://www.wikiwand.com/en/Database_normalization
  • http://cc.cust.edu.tw/~ccchen/doc/db_04.pdf

More from this blog

如何開始入門軟體工程領域 - 名詞解釋(長期更新)

現在應該開始有很多人想要踏入軟體工程的領域,但在進入這個領域之前,覺得先了解一些名詞,可以在入門時更有方向也更知道要用什麼關鍵字去找尋有用的資訊。這篇文章就是想要幫助想要入門的人理解一些軟體工程裡的專有名詞。 作業系統 這一區塊主要解釋跟作業系統層面相關的名詞 英文中文解釋 Operation system 簡稱 OS | 作業系統 | 就是電腦的作業系統,是三大作業系統分別是:Linux、Windows、macOS | | Linux | | 自由和開放原始碼的 UNI...

May 10, 2023

我的 MacBook Pro (Apple Silicon) 設定

現在開始因為 ChatGPT 的出現,各種 AI 助手的功能都跑出來了。想想自己用了許久的環境設定也應該要來重新審視和建立新的開發環境了,僅此紀錄我個人的環境配置步驟和設定。 環境前置步驟 還原 MacBook Pro 至全新環境 macOS(全部資料刪除) 設定好初始設定後,登入 Apple ID 進入 App Store 確定 macOS 版本和預設 APP 都更新到最新 macOS 版本 到系統設定調整所有設定至個人習慣的設定 三指拖移 觸控板手勢開啟 防火牆開啟 輸入法設定...

Apr 25, 2023

ChatGPT 下的發展預想

從 ChatGPT 問世到現在,有許許多多的文章和討論出來。先從最早的 Google 要完蛋了,到後來的工作要被取代了,工程師失業了。 我就比較沒有想要馬上出來評論一下,我喜歡讓子彈飛一會兒。跟討論一下我自己比較在意的討論點。 Google 為什麼慢了? 結論:因為他需要更小心 很多人說 Google 怎麼被微軟搶先了一步。剛開始 Bing 說要加上 AI 的時候大家都在說 Google 怎麼慢了。我就馬上跑去看 OpenAI 的網站,靠北呀啊就 Azure 贊助的。那當然在正式上線 ChatG...

Mar 23, 2023

不工程的攻城獅

223 posts

I am not a programmer because I am not good at programming. But I do programming. Love to learn new things. An animal lover and a dancer. My oshi is 潤羽るしあ.