October 12, 2023

Viiisit [Database] - 資料庫正規化與反正規化!

#database

今天來點資料庫正規化與反正規化!

正規化資料庫

正規化通常分為不同的正規化級別,通常以正規形(NF)表示,如下:

  1. 第一正規形(1NF):
  1. 第二正規形(2NF):
  1. 第三正規形(3NF):

為何需要正規化?

來總結一下為什麼我們需要正規化資料庫吧!
正規化有助於:

緊接著,說到資料庫正規化,是不是也有反正規化?
:有!讓我們來看看吧!

資料庫反正規化

資料庫反正規化(Database Denormalization)是一種在關聯式資料庫中的設計過程,
其目的是為了提高查詢效能或滿足特定應用需求而故意違反正規化原則,
將資料庫中的表格結構先遵守正規化的所有規則,再進行局部調整,故意打破一些正規化規則!

之前有提過,正規化通常是資料庫設計的一個關鍵原則,旨在減少重複數據,提高資料完整性,
但有時候,為了達到更好的查詢效能或簡化某些操作,反正規化可以成為一種有用的策略。

正規化的目標是將數據存在多個表格中,以減少數據的重複性;
而反正規化則是將數據冗餘性增加,把部分數據在不同地方多存幾份,加快數據檢索速度,
犧牲一部分的寫入性能,換取更高的讀取性能。

透過簡單的例子來看看:

正規化 vs 反正規化

透過先前提過的正規化我們可以統整一下兩者的差異:

特徵 正規化 反正規化
數據冗餘性 減少冗餘性,每個數據僅存儲一次。 增加冗餘性,數據在多個位置存儲。
表格數量 使用多個表格來避免重複數據存儲。 使用較少的表格,合併數據以提高查詢效能。
數據完整性 通過外鍵約束確保數據的完整性。 數據完整性可能較難維護。
查詢效能 複雜查詢需要多個 JOIN 操作,效能較慢。 簡化查詢,提高效能。
空間需求 通常用較少的存儲空間。 可能需要更多存儲空間。
數據一致性 通常有較高的數據一致性。 數據一致性可能較難維護。
設計複雜度 較少冗餘,複雜性通常較低。 高冗餘情況下可能需要更複雜的設計。
更新/插入/刪除操作 較簡單,因為每個數據元素僅存儲一次。 較複雜,因為需要同時更新多個位置的數據。

透過整理兩者之間的差異之後,對於要使用正規化還是反正規化可以從自身的需求去判斷。
如果是需要嚴謹要求數據一致性、資料更新頻繁、需要節省空間,可能正規化是好的設計策略;
若是遇到需要簡化查詢、快速讀取資料或許就可以選擇反正規化了!

總之,正規化和反正規化都是有用的工具,但應根據具體的應用需求和性能目標來選擇。有時候,正確的做法可能是在同一個資料庫中同時使用正規化和反正規化,以滿足不同的需求。最重要的是在設計資料庫時深入理解應用需求,並謹慎權衡正規化和反正規化的利弊。

今天就到這啦!下篇見~!


參考資料:
什麼是資料庫正規化?為什麼需要正規化?
什麼是資料庫反正規化?優缺點是什麼?
資料庫正規化筆記