你有沒有看過資料庫的表格長得像雜物倉庫一樣?一格裡面塞一堆電話號碼,另一格是地址寫成一長串,還有一格裡面是好幾個日期用逗號分開。這種「亂七八糟」讓你查資料、更新資料、管理資料都超麻煩。但其實有辦法讓一切變整齊,這個方法就叫做資料正規化。
簡單說,資料正規化就是把資料在表格裡整理好,盡量減少重複,還有避免更新、刪除、插入時出現各種問題。
資料正規化可以解決這些問題:
- 消除資料重複。為什麼要把同樣的資訊存兩次?還是三次?這樣只會讓資料庫變肥,還會讓資料不一致。
- 減少異常狀況。你知道生活中也會有異常嗎?比如說忘記把前同事從聯絡人刪掉。在資料庫裡也會發生這種尷尬。正規化可以幫你避免這些狀況。
- 簡化資料結構。結構越簡單,管理起來越輕鬆。
- 加快資料庫速度。資料少一點,查詢就快一點。
如果不正規化會怎樣?
沒正規化的資料就像「黏黏的」——每次都拖著一堆多餘的資訊。
想像一下 學生 這張表:
| 學生ID | 名字 | 課程 |
|---|---|---|
| 1 | Otto Lin | 數學, 物理 |
| 2 | Anna Song | 化學 |
| 3 | Otto Lin | 生物, 化學 |
會發生什麼問題:
- 資料重複:
Otto Lin出現好幾次。為什麼?因為他修了好幾門課。 - 更新資訊很麻煩:如果 Otto Lin 的電話換了,我們要找出所有有他的紀錄來更新。
- 刪除資料會破壞完整性:假設 Otto 不想上課了。如果我們把他的所有列都刪掉,連名字都沒了。
什麼時候正規化會太多?
老實說,正規化就像超嚴格的行程表:通常很好,但有時候也想隨性一點。其實有些時候,反正規化會比較適合:
- 在分析型資料庫,查詢速度比資料量更重要的時候。
- 當結構變得太複雜:如果為了符合正規化要搞一堆表,查詢會越來越難寫。
- 常用的彙總資料:如果你老是在算同一個總和,乾脆直接存起來。
比如說我們有個網路商店。如果大家常常查詢訂單總金額,可以直接把總金額存在 訂單 表裡,不用每次都重新算。
但要記得,反正規化是種妥協。這樣做會讓更新資料時出錯的機率變高。
問題結構的例子和正規化後的樣子
來看一個正規化前的表格:
| 訂單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。走吧,進入有秩序的資料世界!
GO TO FULL VERSION