Java技術總結:數據庫中的範式和反範式的區別有哪些?

範式是關係數據庫理論的基礎,也是我們在設計數據庫結構過程中所要遵循的規則和指導方法。數據庫的設計範式是數據庫設計所需要滿足的規範。只有理解數據庫的設計範式,才能設計出高效率、優雅的數據庫,否則可能會設計出錯誤的數據庫。

反範式,不滿足範式的模型,就是反範式模型。反範式跟範式所要求的正好相反,在反範式的設計模式,我們可以允許適當的數據的冗餘,用這個冗餘去取操作數據時間的縮短。本質上就是用空間來換取時間,把數據冗餘在多個表中,當查詢時可以減少或者是避免表之間的關聯。

RDBMS模型設計過程中,常常使用範式約束我們的模型,但在NOSQL模型中則大量採用反範式。

Java技術總結:數據庫中的範式和反範式的區別有哪些?

千鋒廣州老師總結數據庫中範式和反範式的的主要區別在於:

在範式化的數據庫中,每個事實數據會出現並且只出現一次;相反,在反範式化的數據庫中,信息是冗餘的,可能會存儲在多個地方。

範式化的優點:

1)範式化的更新操作通常比反範式化要快。

2)當數據較好地範式化時,就只有很少或者沒有重複數據,所以只需要修改更少的數據。

3)範式化的表通常更小,可以更好地放在內存裡,所以執行操作會更快。

4)很少有多餘的數據意味著檢索列表數據時更少需要DISTINCT或者GROUP BY語句。

範式化設計的schema的缺點是通常需要關聯,較多的關聯可能使得一些索引策略無效,例如,範式化可能將列存放在不同的表中,而這些列如果在一個表中本可以屬於同一個索引。

反範式的schema因為所有數據都在一張表中,可以很好地避免關聯。缺點是update操作的代價高,需要更新多個表,至於這會不會是一個問題,需要考慮更新的頻率以及更新的時長,並和執行select查詢的頻率進行比較。

從另一個父表冗餘一些數據到子表的理由通常是排序的需要。

緩存衍生值也是有用的。如果需要顯示每個用戶發了多少消息(像很多論壇做的),可以每次執行一個昂貴的子查詢來計算並顯示它;也可以在user表中建一個num_messages列,每當用戶發新消息時更新這個值。


分享到:


相關文章: