iT邦幫忙

2022 iThome 鐵人賽

DAY 15
1
自我挑戰組

資料庫新手入門--以PostgreSQL為例系列 第 15

Day 15 為什麼要Normalization

  • 分享至 

  • xImage
  •  

如果要求你把這世界所有的資訊全部記錄在一張表格上,那麼可想而知資料絕對亂七八糟,醜到一個不行對吧?資料正規化(Normalization)就是為了處理這個亂象,把資料轉換梳理的很舒服。

什麼是Normalization

簡單的說,正規化就是在拆表格這件事,不過不是隨便拆表格都叫正規化,而會依據一些原則去拆解表格,資料庫設計師會去思考該怎麼拆比較好,不同的設計師可能會有不同的觀點,拆分的表格就會不一樣,不過目的是一樣的。

先來看看沒有進行正規化會有什麼問題?

  1. 相同的資料重覆儲存
  2. 動資料的時候容易有異常
  • 相同的資料重覆儲存什麼意思?什麼意思?
    • 直接來看一個例子,假設我們執行一個計畫,聘用100名計畫人員,我們就必須寫入一百次計畫編號、名稱、主持人等一樣的資訊。
  • 動資料的時候容易有異常什麼意思?什麼意思?
    • 當我們要更新計畫編號2011C00001的主持人的時候,因為資料有一百筆,必需確保一百筆都有被更新,否則資料就產生不一致的異常了。
    • 成立計畫的時候,資料寫入會發生因為,因為要寫入主持人跟計畫人員,否則會發生寫入的資料不完整的異常。
    • 想把計畫編號2011C00002的計畫人員刪除,但是會發生把整筆的計畫資料都刪除的異常。
id 計畫編號 計畫名稱 主持人 主持人信箱 計畫人員
1 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 林力
2 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 朱瑜璿
3 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 郭燕文
2011C00001 深蹲計畫 王小虎 wang175@gmail.com 梁嘉隆
100 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 陳駿琇
101 2011C00002 抑制抓髮計畫 張得正 milk777@gmail.com 陳辰葳

我們再來看一個簡單的例子,有一個資料表是記錄課程與上課老師,看似沒有問題,但是如果今天來了一位新老師,但是這位老師還沒有教的課程,那麼資料怎麼寫入呢?

id course teacher
1 程式設計 王小虎
2 資料庫設計 李逍遙

上述這個問題,我們不得不寫入一筆沒有course只有teacher的不完整資料。(異常)

id course teacher
1 程式設計 王小虎
2 資料庫 李逍遙
3 趙靈兒

為什麼要Normalization?

回到主命題,沒有經過正規化的資料,會被迫儲存不完整的資料,資料正規化(Normalization)就是為了處理這個亂象,把資料轉換梳理。

  1. 減少資料重覆儲存的問題(data redundancy)
  2. 提高資料可維護性,避免動資料的時候所會遇到的異常。

如何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 沒有正規化的資料

https://ithelp.ithome.com.tw/upload/images/20220918/201294303zehu1KWZb.png

1NF 一個欄位一個值

id 計畫編號 計畫名稱 主持人 主持人信箱 計畫人員
1 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 林力
2 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 朱瑜璿
3 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 郭燕文
2011C00001 深蹲計畫 王小虎 wang175@gmail.com 梁嘉隆
100 2011C00001 深蹲計畫 王小虎 wang175@gmail.com 陳駿琇
101 2011C00002 抑制抓髮計畫 張得正 milk777@gmail.com 陳辰葳

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 張得正
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 張得正
id 計畫人員
1 林力
2 朱瑜璿
3 郭燕文
梁嘉隆
100 陳駿琇
101 陳辰葳

反正規化

我們有時候考慮把3NF正規化調回2NF正規化,以避免切分太多資料表之後反而效率變差,以上面這個例子來說只相差一個表格,但是實務上2NF跟3NF會差距的表格數肯定更多,所以這邊就呼應到了上一段所說的內容,選擇2NF或3NF是依據實務狀況進行判斷後所決定。


上一篇
Day 14 為什麼用VIEW
下一篇
Day 16 初探Key
系列文
資料庫新手入門--以PostgreSQL為例30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言