1. 程式人生 > >資料倉庫中,緩慢變化維的一種設計方案

資料倉庫中,緩慢變化維的一種設計方案

資料倉庫中,緩慢漸變維度是一種經常使用到的方案。

“漸變”,即為逐漸變化的維度,因為日常應用中,維度屬性是隨時可能發生變化的,而BI統計時,又可能是需要歷史某個時間點的維度屬性值。所以這種情況下,就需要我們記錄下這個變化資訊,於是漸變維度就出現了。

“緩慢”兩個字,也是需要注意的,僅有緩慢變化的才適用於這種方案。如果是每天每時每刻都在變化的就不適合這種方案了,因為那樣會產生太多太多的記錄,導致維度表記錄過多,影響效率。

下面就先來看一下它的表結構設計:


與漸變相關的幾個欄位:

SCD_StartDate - 該記錄生成時間

SCD_EndDate - 該記錄廢棄時間

SCD_IsActive - 該記錄是否當前啟用狀態

SCD_Version- 該記錄當前版本號

GetItAct - 資料更新時間

外來鍵可以先不看,它與緩慢漸變維度關係不大。

業務欄位:

DeaprtNo為業務主鍵,一般不會發生變化。

DepartName為部門名稱,不過我們並不關心它的歷史狀態,所以需設定為實時更新。其他ENName類似。

DepartType我們關注它的歷史,所以需用ETL工具,設定為漸變更新。

ParentDepartID同樣關注歷史,需設定漸變更新。

可能的更新情況如下:

1. DepartName變化,此時不會產生新的記錄,僅會做如下操作:

   a)更新當前最新記錄的DepartName為最新。

   b)根據業務主鍵DepartNo,更新所有同No的歷史記錄的DepartName為最新。

2.ParentDepartID變化時,則會產生新的記錄,此時會做如下操作:

  a) 修改舊記錄的EndDate為當前時間

  b)修改舊記錄的isActive=0

  c)新增一條新的記錄,StartDate=當前時間,isAtive=1,Version=舊Version+1

  如下圖:


維度表的使用:

1.取最新版資料

select * from dm_depart_dim d
where d.SCD_IsActive = 1


2.取歷史資料 --2013-02-12為時間點

select * from dm_depart_dim d
where  '2013-02-12' between d.SCD_StartDate and d.SCD_EndDate 
or (d.SCD_EndDate is null and  '2013-02-12'  >=d.SCD_StartDate)


3.建立事實表與維度表關聯

如取最新資料,根據SQL1獲取最新資料的ID,放入事實表維度ID外來鍵中

如取歷史資料,根據SQL2獲取歷史資料的ID,放入事實表維度ID外來鍵中