反正規化

摘要:反正規化

正規化的目的是降低資料的重覆性、避免資料更新異常。然而,正規化只是建立資料表的原則,而非鐵的定律。如果過度正規化,在查詢來自於多個資料表的大量資料時,會造成效能下降。因此,若要以查詢(select)效能為考量,必須進行適當的反正規化,亦即將原來的第三正規化降成第二正規化,或是將第二正規化降成第一正規化。

例:描述客戶資料的正規化資料表為「客戶」與「國籍」。

客戶(客戶編號,姓名,國籍編號)

國籍(國籍編號,名稱,人口數)

此設計方法,可以使用關鍵字的查詢,很快查詢到資料,例如查詢客戶編號或國籍編號。但是,若要查詢這兩張資料表所結合(join)的資料時,將會影響查詢效能。因此,將「國籍」做反正規化,可以改善效能的問題。

反正規化之後:

客戶(客戶編號,姓名,國籍編號,名稱,人口數)

但是,在進行反正規化之後可能又會產生資料重覆的問題,以及資料更新的異常問題。

做反正規化之前的建議:

  1. 除非很了解系統的運作流程與商業邏輯,或是已諮詢過系統開發者,否則不輕易做資料表反正規化。
  2. 在進行資料表的反正規化之前,必須徹底了解系統中有哪些功能很頻繁地修改(update)資料表,如果系統功能很頻繁地update資料表,反正規化資料表後會影響update的效能,因為欲update的資料可能是很多筆,例如,將客戶資料表裡國籍編號為TPE的客戶update成國籍編號為TAIWAN,國籍編號為TPE的客戶可能數萬筆以上,實是造成效能上的影響。 

結語:

在做系統分析時,必須依據業務需求去做適當的資料庫規畫,若需求上是以查詢(select)效能為優先考量,資料表就不需要做太多正規化。