什麼是資料庫反正規化?優缺點是什麼?

2023年2月10日

💎 加入 E+ 成長計畫 與超過 300+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

什麼是資料庫反正規化?

資料庫正規化是透過分表的的方式去做到降低資料的重複性、去除相依性等,但他的缺點顯而易見,表跟表之間的耦合性會很高、而且利用 JOIN 的方式查詢會導致速度變慢、拆成多張表的儲存成本也較高

資料庫反正規化(Database Denormalization)是一種將資料庫中的資料再次加工,將資料從正規化狀態轉換為非正規化狀態的過程。而反正規化不等於非正規化(Unnormalized Form),反正規化是先遵守正規化的所有規則,再進行局部調整,故意打破一些正規化規則;而後者非正規化是全然不顧規則。

反正規化的邏輯在於:通過增加冗餘數據或對數據進行分組,犧牲一部分的寫入性能,換取更高的讀取性能。簡單來說,反正規化就是要把某些數據在不同地方多放幾份,加快數據檢索速度

反正規化的優缺點

優點

  1. 查詢效能提升:通過將資訊放在一起,可能增加冗餘性。單因為 JOIN 的數量減少,這會提高查詢效能。
  2. 方便管理:由於粒度高,正規化資料庫很難管理;相反的,反正規化可以提供易於使用的資料,而不是 JOIN 完才能知道其資料的完整性。
  3. 提升報告化過程:分析資料需要迅速進行大量計算。反正規化資料庫生成報告是提供分析資訊的理想解決方案。

缺點

  1. 提升複雜性:在插入、更新資料時增加複雜性以及成本。
  2. 不一致性:因為數據難以更新,所以可能會有數據不一致的問題。
  3. 增加存儲負擔:由於增加了資料的冗余,因此需要更大的儲存空間。

反正規化的技術

Pre-joining Tables

預先將兩張表或多張表 JOIN 起來,而會這樣做通常是因為:

  1. 在查找時,兩張表或多張表常常需要一起查找
  2. JOIN 時是需要耗費大量資源

如下圖所示,下圖將兩張表預先 JOIN ,這樣可以節省大量的時間和多次 JOIN 帶來的資料庫負擔。

Denormalization Pre-Join Table
Denormalization Pre-Join Table
圖片來源:https://phoenixnap.com/kb/database-denormalization

Mirror Tables

Mirror Table 分成「部分複製」以及「全部複製」,常常是用來做備份。另外,有時會需要將數據做別的分析或者建模,因為需要將大量的資料做聚集,而這個步驟可能會導致系統效能降低,因此複製出來另外去處理,會使得原本的服務不會因為大量的計算而被中斷或者降低效能。

Table Splitting

常見的拆分方法有兩種:

  • 水平切分:刻意將不同的 Row 拆分成不同的表,可以利用 ID 的範圍或透過某些條件來拆分。

  • 垂直切分:將不同的 Columne 拆分成不同的表,Primary Key 也會重複出現在不同的表中。

Table Splitting
Table Splitting

Storing Derivable Values

有些數值如果常常用到,就可以先計算好,例如:透過生日要算年齡,就可以新增一個欄位去存放年齡,而不用每次都重新算,如下圖所示:

Database denormalization - Storing Derivable Values
Database denormalization - Storing Derivable Values

相關文章

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們