上一篇文章我們學到了「第二正規化形式」,知道怎麼透過拆表單、刪欄位來避免重複資料。
但你可能會好奇:為什麼叫「第二」正規化形式?還有第一、第三嗎?這些正規化形式到底是什麼?
這篇文章會解釋正規化形式的由來,以及什麼時候可以打破這些規則。
正規化形式是什麼?
正規化形式(Normal Form,簡稱 NF)是前人在資料庫發展的歷史中,發現的一些重要原則。
為什麼會有正規化形式?
在資料庫剛開始發展的時候,大家都在摸索:表單要怎麼設計才好?欄位要怎麼安排?
經過很多人的實際經驗和研究,他們發現了一些共同的問題:
- 把太多欄位塞在同一張表單,會造成資料重複
- 資料重複之後,修改的時候要改很多次
- 改很多次就容易漏改,造成資料不一致
於是,這些前人把他們的經驗整理成一套規則,告訴後人:「如果你要設計資料庫的表單架構,最好遵循這些規則。」
這些規則就是「正規化形式」。
正規化形式的目標
所有正規化形式的目標都是同一個:
確保資料庫裡的資料不會重複。
不同的正規化形式,是從不同的角度來檢查「有沒有重複」。
例如第二正規化形式,就是在檢查:「這張表單裡,有沒有欄位是跟著其他欄位走的?如果有,就應該拆出去。」
簡單來說
正規化形式就是前人留下來的智慧。
你不需要自己從零開始摸索怎麼設計資料庫,只要遵循這些規則,就能設計出乾淨、不重複的資料庫架構。
為什麼叫「第二」正規化形式?
你可能會問:為什麼上一篇文章介紹的是「第二」正規化形式,而不是從第一個開始?
原因很簡單:這樣比較好理解。
正規化形式有很多條,常見的有:
- 第一正規化形式(1NF)
- 第二正規化形式(2NF)
- 第三正規化形式(3NF)
- 還有更多…
但這些編號只是教學和溝通上的方便。實際上,你不需要死背「這是第幾條」,重要的是理解背後的原則。
設計表單設計久了之後,你會發現這些規則其實非常符合直覺。我們把它們點出來,是為了讓大家有一個明確的規則可以依循。
什麼時候可以打破正規化形式?
這些規則大概適用於 90% 的情況,但總是有例外。
效能考量
舉個例子:假設你已經把表單拆得很乾淨,每次要查「飯店電話」的時候,你要:
- 先從訂房表單找到房型 ID
- 再從房型表單找到飯店 ID
- 最後從飯店表單找到電話
這樣要跨兩張表單才能找到電話,效能可能會比較差。
如果你的系統非常在意查詢速度,而且你很確定這個欄位不會經常修改,那你可以刻意違反正規化形式,把電話直接存在訂房表單裡,省去查詢的時間。
彈性考量
有時候為了系統的彈性,也會刻意保留一些重複的資料。
重點:先學規則,再學打破規則
但要記住一件事:
我們都是先學規則,再來學什麼情境下可以打破規則。
絕對不是一開始就漫無目標地亂做,然後說「本來就沒有規則」。
學任何東西都是這樣:
- 先把正規化形式學好
- 嚴格遵守這些規則
- 直到你遇到特殊情況(效能、彈性等考量)
- 你可以刻意違反正規化形式,但要能說出原因
如果你說不出為什麼要違反規則,那就代表你應該繼續遵守規則。
正規化形式與欄位限制
在實作正規化形式的時候,我們有時候會需要替欄位加上一些「限制」。
這些限制可以幫助我們:
- 確保進來的資料符合規定
- 如果資料不符合限制,就會被拒絕,不會被存進資料庫
例如:你可以設定「會員 ID」欄位不能是空的,或者「房型 ID」必須對應到房型表單裡的某一筆資料。
這些限制會在後續的文章中詳細說明,現在只要知道有這個東西就好。
正規化形式重點整理
這篇文章介紹了正規化形式的基本概念:
- 正規化形式是前人留下來的智慧,幫助我們設計不重複的資料庫
- 常見的有 1NF、2NF、3NF,但不需要死背編號,重要的是理解原則
- 核心目標是讓重複的資料最小化
- 90% 的情況應該遵守規則,但在效能或彈性的考量下,可以刻意違反
- 先學規則,再學打破規則——要能說出為什麼違反,才能違反
- 後續會介紹欄位限制,幫助我們實作正規化形式
接下來的文章會繼續介紹其他的正規化形式,以及如何用欄位限制來確保資料的正確性。