天天看點

緩慢變化維解決方案 - 小強齋太

緩慢變化維解決方案

緩慢變化維解決方案

緩慢變化維解決方案 Slowly Changing Dimensions (SCD)

are dimensions that have data that slowly changes.

緩慢變化維:

資料會發生緩慢變化的次元就叫”緩慢變化維”。

舉個例子就清楚了:

在一個零售業資料倉庫中,事實表儲存着各銷售人員的銷售記錄,某天一個銷售人員從北京分公司調到上海分公司了,那麼如何來儲存這個變化呢?也就是說銷售人員次元要怎麼恰當的處理這一變化。先來回答一個問題,為什麼要處理,或儲存這一變化?如果我們要統計北京地區或上海地區的總銷售情況的時候,這個銷售人員的銷售記錄應該算在北京還是算在上海?當然是調離前的算在北京,調離後的算在上海,但是如标記這個銷售人員所屬區域?這裡就需要處理一下這個次元的資料,即我們緩慢變化維需要做的事情。

處理緩慢變化維一般按不同情況有以下幾種解決方案:

一. 新資料覆寫舊資料

此方法必須有前提條件,即你不關心這個數劇的變化。例如,某個銷售人員的英文名改了,如果你不關心員工的英文名有什麼變化則可直接覆寫資料倉庫中的資料。

二.  儲存多條記錄,并添加字段加以區分

這種情況下直接新添一條記錄,同時保留原有記錄,并用單獨的專用的字段儲存差別。如:

(以下表格中Supplier_State表示上面例子中所屬區域,為描述清晰,不用代理鍵表示)

添加是否可用來辨別新舊資料:

Supplier_key Supplier_Code Supplier_Name Supplier_State Disable
001 ABC Phlogistical Supply Company CA Y
002 ABC Phlogistical Supply Company IL N

添加資料版本資訊标記新舊資料:

Supplier_key Supplier_Code Supplier_Name Supplier_State Version
001 ABC Phlogistical Supply Company CA
002 ABC Phlogistical Supply Company IL 1

添加記錄的生效日期和失效日期來辨別新舊資料

Supplier_key Supplier_Code Supplier_Name Supplier_State Start_Date End_Date
001 ABC Phlogistical Supply Company CA 01-Jan-2000 21-Dec-2004
002 ABC Phlogistical Supply Company IL 22-Dec-2004

空的End_Date表示目前版本資料,或者你也可以用一個預設的大時間 (如: 12/31/9999)來代替空值, 這樣資料還能被索引識别到.

混合模式:

這種模式是以上幾種模式的混合體,相對而言此種方法更全面,更能應對錯綜複雜且易變化的使用者需求,也是較為常用的。

Row_Key Supplier_key Supplier_Code Supplier_Name Supplier_State Start_Date End_Date Current Indicator
1 001 ABC001 Phlogistical Supply Company CA 22-Dec-2004 15-Jan-2007 N
2 001 ABC001 Phlogistical Supply Company IL 15-Jan-2007 1-Jan-2099 Y

        此種方法有以下幾條優點: 

  1.  能用簡單的過濾條件選出次元目前的值。
  2. 能較容易的關聯出曆史任意一時刻事實資料的值。
  3. 如果事實表中有一些時間字段(如:Order Date, Shipping Date, Confirmation Date),那麼我們很容易選擇哪一條次元資料進行關聯分析。

其中

Row_Key

Current Indicator

字段是可有可無的,加上去更友善,畢竟次元表的資料都不大,多點備援字段不占太大空間但能提高查詢效率。

這種設計模式下事實表應以

Supplier_key

為外鍵,雖然這個字段不能唯一辨別一條次元資料,進而形成了事實表與維表多對多的關系,是以在做事實和次元做關聯時應加上時間戳字段(或

Indicator

字段)。

三.  不同字段儲存不同值

這種方法用不同的字段儲存變化痕迹,但是不能象第二種方法一樣儲存所有變化記錄,它隻能儲存兩次變化記錄.适用于變化不超過兩次的次元。

Supplier_key Supplier_Name Original_Supplier_State Effective_Date Current_Supplier_State
001 Phlogistical Supply Company CA 22-Dec-2004 IL

四.  另外建表儲存曆史記錄

 即另外建一個曆史表來表存變化的曆史記錄,而次元隻儲存目前資料。

Supplier:
Supplier_key Supplier_Name Supplier_State
001 Phlogistical Supply Company IL
Supplier_History:
Supplier_key Supplier_Name Supplier_State Create_Date
001 Phlogistical Supply Company CA 22-Dec-2004

這種方法僅僅記錄一下變化曆史痕迹,其實做起統計運算來還是不友善的。

五. 保證事實表和維表的參照完整性

次元表如果儲存多條記錄,事實表需要做相應處理,來保證參照完整性

方案一 : 複合主鍵參照次元表

Supplier Dimension:
Version_Number Supplier_key Supplier_Code Supplier_Name Supplier_State Start_Date End_Date
1 001 ABC001 Phlogistical Supply Company CA 22-Dec-2004 15-Jan-2007
001 ABC001 Phlogistical Supply Company IL 15-Jan-2007 1-Jan-2099
Fact Delivery:

(為描述清晰,同樣不使用代理鍵辨別次元)

Delivery_Key Supplier_key Supplier_version_number Quantity Product Delivery_Date Order_Date
1 001 132 Bags 22-Dec-2006 15-Oct-2006
2 001 324 Chairs 15-Jan-2007 1-Jan-2007

 Version_Number和Supplier_key可作為複合主鍵在兩實體間建立連結,可解決事實表和維表多對多關系問題

方案二:在事實表參照次元表的代理鍵,解決參照完整性

Supplier Dimension:
Surrogate_key Version_Number Supplier_key Supplier_Code Supplier_Name Supplier_State Start_Date End_Date
1 1 001 ABC001 Phlogistical Supply Company CA 22-Dec-2004 15-Jan-2007
2 001 ABC001 Phlogistical Supply Company IL 15-Jan-2007 1-Jan-2099
Fact Delivery:
Delivery_Key Supplier _Surrogate_key Quantity Product Delivery_Date Order_Date
1 1 132 Bags 22-Dec-2006 15-Oct-2006
2 1 324 Chairs 15-Jan-2007 1-Jan-2007