CodeGym /課程 /SQL SELF /資料正規化入門

資料正規化入門

SQL SELF
等級 25 , 課堂 0
開放

你有沒有看過資料庫的表格長得像雜物倉庫一樣?一格裡面塞一堆電話號碼,另一格是地址寫成一長串,還有一格裡面是好幾個日期用逗號分開。這種「亂七八糟」讓你查資料、更新資料、管理資料都超麻煩。但其實有辦法讓一切變整齊,這個方法就叫做資料正規化。

簡單說,資料正規化就是把資料在表格裡整理好,盡量減少重複,還有避免更新、刪除、插入時出現各種問題。

資料正規化可以解決這些問題:

  1. 消除資料重複。為什麼要把同樣的資訊存兩次?還是三次?這樣只會讓資料庫變肥,還會讓資料不一致。
  2. 減少異常狀況。你知道生活中也會有異常嗎?比如說忘記把前同事從聯絡人刪掉。在資料庫裡也會發生這種尷尬。正規化可以幫你避免這些狀況。
  3. 簡化資料結構。結構越簡單,管理起來越輕鬆。
  4. 加快資料庫速度。資料少一點,查詢就快一點。

如果不正規化會怎樣?

沒正規化的資料就像「黏黏的」——每次都拖著一堆多餘的資訊。

想像一下 學生 這張表:

學生ID 名字 課程
1 Otto Lin 數學, 物理
2 Anna Song 化學
3 Otto Lin 生物, 化學

會發生什麼問題:

  • 資料重複Otto Lin 出現好幾次。為什麼?因為他修了好幾門課。
  • 更新資訊很麻煩:如果 Otto Lin 的電話換了,我們要找出所有有他的紀錄來更新。
  • 刪除資料會破壞完整性:假設 Otto 不想上課了。如果我們把他的所有列都刪掉,連名字都沒了。

什麼時候正規化會太多?

老實說,正規化就像超嚴格的行程表:通常很好,但有時候也想隨性一點。其實有些時候,反正規化會比較適合:

  1. 在分析型資料庫,查詢速度比資料量更重要的時候。
  2. 當結構變得太複雜:如果為了符合正規化要搞一堆表,查詢會越來越難寫。
  3. 常用的彙總資料:如果你老是在算同一個總和,乾脆直接存起來。

比如說我們有個網路商店。如果大家常常查詢訂單總金額,可以直接把總金額存在 訂單 表裡,不用每次都重新算。

但要記得,反正規化是種妥協。這樣做會讓更新資料時出錯的機率變高。

問題結構的例子和正規化後的樣子

來看一個正規化前的表格:

訂單ID 客戶 商品 訂單金額
1 Otto Lin 手機, 耳機 20000
2 Anna Song 冰箱 30000
3 Otto Lin 電視 40000

這裡明顯有問題:

  • 客戶資料重複。
  • 商品用列表存——這違反了資料原子性原則。

正規化後

我們把這張表拆成三張: 表格 客戶

客戶ID 名字
1 Otto Lin
2 Anna Song

表格 商品

商品ID 名稱 價格
1 手機 10000
2 耳機 10000
3 冰箱 30000
4 電視 40000

表格 訂單

訂單ID 客戶ID 商品ID
1 1 1
1 1 2
2 2 3
3 1 4

現在我們:

  • 沒有資料重複。
  • 每個商品都在自己的列。
  • 可以輕鬆新增商品和訂單。

正規化就是把混亂變成秩序的藝術。有時候它看起來很嚴格很麻煩,但它的目標絕對值得你花時間。接下來的課我們會一個一個學正規化的階段:先 1NF,再 2NF,最後 3NF。走吧,進入有秩序的資料世界!

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION