數倉緩慢變化維SCD深度講解
前言
維度緩慢變化維SCD(Slowly Changing Dimensions)一些維度表的數據不是靜態的,而是會隨著時間而緩慢地變化(這里的緩慢是相對事實表而言,事實表數據變化的速度比維度表快,如果還不知道什么是事實表和維度表請看→數倉模型設計詳細講解)把處理維度表數據歷史變化的問題,稱為緩慢變化維問題,簡稱SCD問題。
舉例說明
例如:用根據用戶維度,統計不同出生年份的消費金額占比。(80后、90后、00后)。而期間,用戶可能去修改用戶數據,例如:將出生日期改成了 1992年。此時,用戶維度表就發生了變化。當然這個變化相對事實表的變換要慢。但這個用戶維度表的變化,就是緩慢變化維。
這個用戶的數據不是一直不變,而是有可能發生變化。例如:用戶修改了出生日期、或者用戶修改了住址。
一、SCD問題的幾種解決方案
以下為解決緩慢變化維問題的幾種辦法:
- 保留原始值
- 改寫屬性值
- 增加維度新行
- 增加維度新列
- 添加歷史表
1.1 保留原始值
某一個屬性值絕不會變化。事實表始終按照該原始值進行分組。例如:出生日期的數據,始終按照用戶第一次填寫的數據為準
1.2 改變屬性值
對其相應需要重寫維度行中的舊值,以當前值替換。因此其始終反映最近的情況。
當一個維度值的數據源發生變化,并且不需要在維度表中保留變化歷史時,通常用新數據來覆蓋舊數據。這樣的處理使屬性所反映的中是最新的賦值。
用戶維度表 修改前:
修改后:
- 這種方法有個前提,用戶不關心這個數據的變化
- 這樣處理,易于實現,但是沒有保留歷史數據,無法分析歷史變化信息
1.3 增加維度新行
數據倉庫系統的目標之一是正確地表示歷史。典型代表就是拉鏈表
保留歷史的數據,并插入新的數據。
用戶維度表 修改前:圖片修改后:
1.4 增加維度新列
用不同的字段來保存不同的值,就是在表中增加一個字段,這個字段用來保存變化后的當前值,而原來的值則被稱為變化前的值。總的來說,這種方法通過添加字段來保存變化后的痕跡。
用戶維度表 修改前:
修改后
1.5 使用歷史表
另外建一個表來保存歷史記錄,這種方式就是將歷史數據與當前數據完全分開來,在維度中只保存當前最新的數據。用戶維度表
用戶維度歷史表
這種方式的優點是可以同時分析當前及前一次變化的屬性值,缺點是只保留了最后一次變化信息。
思考
我在這里給大家提個場景題,比如我們在淘寶上購買一件商品,從下單-支付-發貨-配送-確認收貨這個幾步流。需求:統計出在發送到配置過程中轉了幾次?
小結
今天給大家分享了SCD解決方案,但是其實以上的解決方案不是很好,其實數倉有一個非常好的解決緩慢變化維拉鏈表既保留了歷史數據又不會造成數據冗余,拉鏈表我們下期講。信自己,努力和汗水總會能得到回報的。我是大數據老哥,我們下期見。
本文轉載自微信公眾號「大數據老哥」,可以通過以下二維碼關注。轉載本文請聯系大數據老哥公眾號。