正規化or 反正規化,優缺點一次說明 - Life coding, record life.
文章推薦指數: 80 %
正規化要解決的事情是降低資料的重複性,你不會在一個table 裡面看到 ... 資料庫正規化到極致,很有可能讓後續維護困難以下幾種情境可以使用反正規化.
JamieHuang
Learningbydoing,notjustsaying.
首頁
分類
標籤
所有文章
說說英文
關於
GitHub
Medium
Linkedin
youhavetodecideuntilknowingeverythingphotobyCasparCamilleRubin
正規化or反正規化,優缺點一次說明
九月7,2021
分類
coding
沒有最佳解,你必須通盤了解,才能找到最適解!
本文大綱
本文大綱
正規化
正規化細節
什麼時候反正規化
學習重點
參考連結
正規化
最近在寫程式時,常面臨到databasejoin來join去,導致於執行速度過慢,開發時,又要理解很多table之間的關聯,正規化真的好嗎?
當你不知道選擇哪個架構,往往是你不清楚你想要什麼?
正規化要解決的事情是降低資料的重複性,你不會在一個table裡面看到訂單資料、使用者資料,這樣這張表就太多column,一個視窗也拉不完,因此會將訂單資料成一個獨立的表,使用者資料成另一個獨立表,可避免資料重複。
正規化的優點:
降低資料的重複性
去除相依性,利用外部索引鍵,產生關聯
update資料較快(因update部分資料,例如:只想更新使用者地址,那就更新使用者資料,不必更新訂單的每個資料)
正規化的缺點:
耦合性高,牽一髮動全身(約束性強)
查詢較慢(如jointable到一定數量,爆炸慢)
DBI/O繁忙,因為join很多表
儲存成本高
正規化細節
第一正規化:去除重複性,像是購物車訂單,不會包含此筆訂單下的所有商品,不會存成…
錯誤示範cart_orders
id
user
product
1
jamie
麥片、水果
2
win
水果、滑鼠
3
leo
滑鼠、麥片
應該會存成下面這樣,才會是模範生…
正確示範cart_orders
id
user
product
1
jamie
麥片
2
jamie
水果
3
win
水果
4
win
滑鼠
5
leo
滑鼠
6
leo
麥片
第二正規化:去除相依性,使用外部索引鍵,讓這些資料表產生關聯,而不是一張table塞入所有資訊
不要以為剛剛那樣就很完美,還有一些地方可以優化,仔細看下面示範,把user與product放在同一張表內
錯誤示範cart_orders
id
user
product
1
jamie
麥片
2
jamie
水果
3
win
水果
4
win
滑鼠
5
leo
滑鼠
6
leo
麥片
應該要分成兩張表users跟cart_orders
正確示範cart_orders
id
user_id
product
1
1
麥片
2
1
水果
3
2
水果
4
2
滑鼠
5
3
滑鼠
6
3
麥片
正確示範users
id
name
1
jamie
2
win
3
leo
第三正規化:刪除不依賴索引鍵的欄位,例如說:訂單數量count與單價unit_price已經存在表單,又多了每一筆訂單的amount,就是不必要的
因此,剛剛的schema還可以優化,例如說以下錯誤示範
錯誤示範cart_orders
id
user_id
product
count
unit_price
amount
1
1
麥片
2
2
4
2
1
水果
3
1
3
3
2
水果
4
1
4
4
2
滑鼠
1
10
10
5
3
滑鼠
7
10
70
6
3
麥片
10
2
20
應該要把相依性amount拿掉
正確示範cart_orders
id
user_id
product
count
unit_price
1
1
麥片
2
2
2
1
水果
3
1
3
2
水果
4
1
4
2
滑鼠
1
10
5
3
滑鼠
7
10
6
3
麥片
10
2
什麼時候反正規化
教科學經常告訴學生最好的參照方式,但實際運用時必須考慮天時、地利、人和,簡單說,就是必須考量到實際運用情境。
當你遇到商業邏輯極為複雜時,又使得資料庫正規化到極致,很有可能讓後續維護困難
以下幾種情境可以使用反正規化
耦合性高,牽一髮動全身(約束性強)
經常要查詢,但不常更動的設計(因為常查詢如果反正規化可以少join一堆table)
資料不超過百萬
不要求快速寫入
學習重點
這一次要重整公司複雜的商業邏輯,因過去時空背景下,是將資料正規化到極致,導致於後續維護成本高,因此尋找有沒有更簡單的解法,
可以讓前人種樹,後人乘涼的解法,因此找到了反正規化,因此寫了兩者的比較,讓自己對databaseschema設計更了解,才能設計出更好的架構。
可以簡單,何必複雜!
參考連結
資料庫到底要不要做正規化
正規與反正規化的戰爭
標籤
database
下一篇
上一篇
下一篇
上一篇
分享到Facebook
分享到Twitter
分享到Google+
JamieHuang
Learningbydoing,notjustsaying.
WebDeveloper
Taiwan,Keelung
延伸文章資訊
- 1資料庫正規化與反正規化使用時機 - Mobile01
今天跟同事討論金流處理的設計,在資料庫方面有認知上的不同。1.我偏向DB自動產生流水號當唯一鍵和做索引,訂單編號另外 ... 反正規化資料庫,會讓後續接手的人看不懂.
- 2資料庫的反正規化化(Denormalization)設計- IT閱讀
資料庫的反正規化化(Denormalization)設計. mysql教程 · 發表 2018-10-08. 正規化化設計目標的主要目的就是“減少不必要的更新”。但事事都具有兩面性,在對資料庫進...
- 3第九章邏輯資料庫設計: 關聯表的正規化
可配合「反正規化技巧」(De-normalization) 提. 高效率. ▫ 所以, 要不要正規化?或是正規化到何種程度? 的問題實在是見仁見智, 也是設計資料庫的一. 項重要考量 ...
- 4反正規化| JasonChang的學習歷程 - 點部落
正規化的目的是降低資料的重覆性、避免資料更新異常。然而,正規化只是建立資料表的原則,而非鐵的定律。如果過度正規化,在查詢來自於多個資料表的 ...
- 530-17之MongoDB的設計---正規與反正規化的戰爭 - iT 邦幫忙
Database normalization is the process of organizing the fields and tables of a relational databas...