1. 程式人生 > >資料庫設計:正規化與反正規化

資料庫設計:正規化與反正規化

我們在設計資料庫的過程中,往往要用到正規化或反正規化的設計模式。熟悉地掌握正規化與反正規化的要領,學會在實際開發中恰當地混合使用正規化與反正規化,才能設計出結構合理,執行高效的資料庫。

下面就以一個經典的例子進行講述正規化與反正規化:

職工-部門表:

這裡寫圖片描述

部門-部門領導表:

這裡寫圖片描述

結合這兩張表,我們知道,職工Tom與Hill都在部門Accounting工作,他們的領導是Alex。這種設計模式,稱為正規化。正規化要求資料表中不存在任何的傳遞函式依賴。我們都知道職工,部門,領導之間有傳遞函式的依賴關係:職工–>部門–>領導。但是正規化的設計模式將這種關係分開,使這種傳遞的關係在資料表中不再存在。

下面來看看反正規化的設計模式:

反正規化允許表中存在傳遞函式依賴。

這裡寫圖片描述

在這一張表中,我們直接看到職工Tom工作的部門為Accounting,這個部門的領導是Alex。表中就有職工–>部門–>領導的傳遞函式依賴關係。

正規化與反正規化的比較:

  1. 查詢記錄時,正規化模式往往要進行多表連線,而反正規化只需在同一張表中查詢,當資料量很大的時候,顯然反正規化的效率會更好。
  2. 反正規化有很多重複的資料,會佔用更多的記憶體,查詢時可能會較多地使用DROUP BY或DISTINCT等耗時耗效能的關鍵字。
  3. 當要修改更新資料時(例如修改Accounting部門的領導為Russell),正規化更靈活
    ,而反正規化要修改全部的資料,且易出錯。 

總結:關於正規化與反正規化的比較還有很多很多,二者各有各的好處,在實際開發中應該根據需要合理地混用不同的模式,最大程度地結合發揮各自的優點。

轉載自:http://blog.csdn.net/qq_33290787/article/details/51956532