如果要求你把這世界所有的資訊全部記錄在一張表格上,那麼可想而知資料絕對亂七八糟,醜到一個不行對吧?資料正規化(Normalization)就是為了處理這個亂象,把資料轉換梳理的很舒服。
什麼是Normalization
簡單的說,正規化就是在拆表格這件事,不過不是隨便拆表格都叫正規化,而會依據一些原則去拆解表格,資料庫設計師會去思考該怎麼拆比較好,不同的設計師可能會有不同的觀點,拆分的表格就會不一樣,不過目的是一樣的。
先來看看沒有進行正規化會有什麼問題?
- 相同的資料重覆儲存
- 動資料的時候容易有異常
- 相同的資料重覆儲存什麼意思?什麼意思?
- 直接來看一個例子,假設我們執行一個計畫,聘用100名計畫人員,我們就必須寫入一百次計畫編號、名稱、主持人等一樣的資訊。
- 動資料的時候容易有異常什麼意思?什麼意思?
- 當我們要更新計畫編號2011C00001的主持人的時候,因為資料有一百筆,必需確保一百筆都有被更新,否則資料就產生不一致的異常了。
- 成立計畫的時候,資料寫入會發生因為,因為要寫入主持人跟計畫人員,否則會發生寫入的資料不完整的異常。
- 想把計畫編號2011C00002的計畫人員刪除,但是會發生把整筆的計畫資料都刪除的異常。
我們再來看一個簡單的例子,有一個資料表是記錄課程與上課老師,看似沒有問題,但是如果今天來了一位新老師,但是這位老師還沒有教的課程,那麼資料怎麼寫入呢?
id |
course |
teacher |
1 |
程式設計 |
王小虎 |
2 |
資料庫設計 |
李逍遙 |
上述這個問題,我們不得不寫入一筆沒有course只有teacher的不完整資料。(異常)
id |
course |
teacher |
1 |
程式設計 |
王小虎 |
2 |
資料庫 |
李逍遙 |
3 |
|
趙靈兒 |
為什麼要Normalization?
回到主命題,沒有經過正規化的資料,會被迫儲存不完整的資料,資料正規化(Normalization)就是為了處理這個亂象,把資料轉換梳理。
- 減少資料重覆儲存的問題(data redundancy)
- 提高資料可維護性,避免動資料的時候所會遇到的異常。
如何Normalization?
用真實世界的實體去思考,例如我們可以把上例拆成課程跟老師,課程表當中把原本老師的名稱替換成id,而我們要使用這個id去對應老師表的名稱,如此一來就能梳理出乾淨的資料了。
id |
course |
teacher_id |
1 |
程式設計 |
1 |
2 |
資料庫 |
2 |
id |
teacher |
1 |
王小虎 |
2 |
李逍遙 |
3 |
趙靈兒 |
Normalization Level
0NF : 沒有正規化的資料。
1NF : 一個欄位一個值。
2NF : 把資料放到合適的表格。
3NF : 欄位之間不可以推導。
後續還有BCNF、4NF、5NF、6NF有著更加嚴格的條件,但是正規化不是萬靈丹,當表格拆分太多的時候,效能也會降低,因此多數時候我們會把正規化的等級選擇在2NF或3NF,是兼具資料整齊與資料庫效能的平衡方案。
0NF 沒有正規化的資料
1NF 一個欄位一個值
2NF : 把資料放到合適的表格
id |
計畫編號 |
計畫名稱 |
主持人id |
計畫人員id |
1 |
2011C00001 |
深蹲計畫 |
1 |
1 |
2 |
2011C00001 |
深蹲計畫 |
1 |
2 |
3 |
2011C00001 |
深蹲計畫 |
1 |
3 |
… |
2011C00001 |
深蹲計畫 |
1 |
… |
100 |
2011C00001 |
深蹲計畫 |
1 |
100 |
101 |
2011C00002 |
抑制抓髮計畫 |
2 |
101 |
id |
計畫人員 |
1 |
林力 |
2 |
朱瑜璿 |
3 |
郭燕文 |
… |
梁嘉隆 |
100 |
陳駿琇 |
101 |
陳辰葳 |
3NF : 欄位之間不可以推導
id |
計畫id |
主持人id |
計畫人員id |
1 |
1 |
1 |
1 |
2 |
1 |
1 |
2 |
3 |
1 |
1 |
3 |
… |
… |
… |
… |
100 |
1 |
1 |
100 |
101 |
2 |
2 |
101 |
id |
計畫編號 |
計畫名稱 |
1 |
2011C00001 |
深蹲計畫 |
2 |
2011C00002 |
抑制抓髮計畫 |
id |
計畫人員 |
1 |
林力 |
2 |
朱瑜璿 |
3 |
郭燕文 |
… |
梁嘉隆 |
100 |
陳駿琇 |
101 |
陳辰葳 |
反正規化
我們有時候考慮把3NF正規化調回2NF正規化,以避免切分太多資料表之後反而效率變差,以上面這個例子來說只相差一個表格,但是實務上2NF跟3NF會差距的表格數肯定更多,所以這邊就呼應到了上一段所說的內容,選擇2NF或3NF是依據實務狀況進行判斷後所決定。