資料庫到底要不要做正規化
目錄
Normalize until it hurts, denormalize until it works.
資料庫的設計有個基本的作法是 - 正規化
資料庫正規化
資料庫正規化是用來消除重複資料,提升硬碟效能以及降低更新錯誤的一種設計方式。
消除重複資料就能減少 開發成本
以及 儲存成本
當你拆分資料表關聯的程度愈多,代表正規化的程度也愈高,資料關聯性的約束性也愈強,
但同時也代表資料被切分為多張關聯表格
- DB I/O 更加繁忙
- JOINs 的狀況也愈多
什麼時候做正規化?
考量需回歸 Data 本身特性
如果有以下情況的話,做正規化會是好的選擇
- 避免大量資料重複問題,或同步機敏資訊避免暴露的情況
- 允許你使用更簡單的 Query 查詢
- 更好的查詢效能
要不要正規化?
我們通常怎麼取捨或決定?
資料成長幅度會不會破百萬?
你是不是被 Join 困擾
正規劃程度越高, Join 愈複雜。這時候造成開發上的困擾時,其實可以考慮做反正規化了。
結語
以前都被教育也習慣開發就直接以正規化方式開下去,重新讀完這兩篇文章的觀點之後…
覺得 適度的反正規劃 或者 乾脆不正規化 其實都是不錯的選擇。
現在我可能會這樣看:
- 開發環境有沒有 ORM 還是只有 Query Builder?
- 如果資料成長幅度不大的設計,直接不做正規化應該也是很舒適
- 至於重複性的 Data 根據上一點的想法,就交給 $$ Money 跟硬體解決吧!
- $$ 可以解決的問題,都不會是問題
Normalize until it hurts, denormalize until it works.