Java學習筆記:資料庫中的正規化和反正規化

千鋒武漢發表於2021-05-18

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

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

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

  資料庫中正規化和反正規化的的主要區別在於:

1

  在正規化化的資料庫中,每個事實資料會出現並且只出現一次;相反,在反正規化化的資料庫中,資訊是冗餘的,可能會儲存在多個地方。

  正規化化的優點:

  1)正規化化的更新操作通常比反正規化化要快。

  2)當資料較好地正規化化時,就只有很少或者沒有重複資料,所以只需要修改更少的資料。

  3)正規化化的表通常更小,可以更好地放在記憶體裡,所以執行操作會更快。

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

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

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

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

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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31548651/viewspace-2771616/,如需轉載,請註明出處,否則將追究法律責任。

相關文章