資料倉庫中,緩慢變化維的一種設計方案
資料倉庫中,緩慢漸變維度是一種經常使用到的方案。
“漸變”,即為逐漸變化的維度,因為日常應用中,維度屬性是隨時可能發生變化的,而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外來鍵中