数据库中的范式和反范式详解!
范式是關系數據庫理論的基礎,也是我們在設計數據庫結構過程中所要遵循的規則和指導方法。數據庫的設計范式是數據庫設計所需要滿足的規范。只有理解數據庫的設計范式,才能設計出率、優雅的數據庫,否則可能會設計出錯誤的數據庫。
反范式,不滿足范式的模型,就是反范式模型。反范式跟范式所要求的正好相反,在反范式的設計模式,我們可以允許適當的數據的冗余,用這個冗余去取操作數據時間的縮短。本質上就是用空間來換取時間,把數據冗余在多個表中,當查詢時可以減少或者是避免表之間的關聯。
RDBMS模型設計過程中,常常使用范式約束我們的模型,但在NOSQL模型中則大量采用反范式。
數據庫中范式和反范式的的主要區別在于:
在范式化的數據庫中,每個事實數據會出現并且只出現一次;相反,在反范式化的數據庫中,信息是冗余的,可能會存儲在多個地方。
范式化的優點:
1)范式化的新操作通常比反范式化要快。
2)當數據較好地范式化時,就只有很少或者沒有重復數據,所以只需要修改少的數據。
3)范式化的表通常小,可以好地放在內存里,所以執行操作會快。
4)很少有多余的數據意味著檢索列表數據時少需要DISTINCT或者GROUP BY語句。
范式化設計的schema的缺點是通常需要關聯,較多的關聯可能使得一些索引策略無效,例如,范式化可能將列存放在不同的表中,而這些列如果在一個表中本可以屬于同一個索引。
反范式的schema因為所有數據都在一張表中,可以很好地避免關聯。缺點是update操作的代價高,需要新多個表,至于這會不會是一個問題,需要考慮新的頻率以及新的時長,并和執行select查詢的頻率進行比較。
從另一個父表冗余一些數據到子表的理由通常是排序的需要。
緩存衍生值也是有用的。如果需要顯示每個用戶發了多少消息(像很多論壇做的),可以每次執行一個昂貴的子查詢來計算并顯示它;也可以在user表中建一個num_messages列,每當用戶發新消息時新這個值。
本文來自千鋒教育,轉載請注明出處。
總結
以上是生活随笔為你收集整理的数据库中的范式和反范式详解!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java面试宝典之开源框架!
- 下一篇: 程序员面试之MySQL数据库表的设计