維度能夠根據變化劇烈程度主要分爲無變化維度、緩慢變化維度和劇烈變化維度。例如一我的的相關信息,身份證號、姓名和性別等信息數據屬於不變的部分,政治面貌和婚姻狀態屬於緩慢變化部分,而工做經歷、工做單位和培訓經歷等在某種程度上屬於急劇變化字段。設計
對於劇烈變化維度,一般狀況下都是一分爲二進行處理的,把其中不常變更的部分單獨抽出來做爲一個維表,按照緩慢變化維方式進行處理;另一部分也單獨抽取出來,一般做爲維度的屬性進行處理。代理
大多數維度表隨時間的遷移是緩慢變化的。好比增長了新的產品,或者產品的ID號碼修改了,或者產品增長了一個新的屬性,此時,維度表就會被修改或者增長新的記錄行。這樣,在設計維度和使用維度的過程當中,就要考慮到緩慢變化維度的處理。產品
緩慢漸變維,即維度中的屬性可能會隨着時間發生改變,好比包含用戶住址Address的DimCustomer維度,用戶的住址可能會發生改變,進而影響業務統計精度,DimCustomer維度就是緩慢漸變維(SCD),對於SCD,處理方式一般有如下幾種:it
Type 1:徹底不記錄歷史變化信息,在ETL將數據載入SCD的時候,對於會產生變化的屬性值直接覆蓋,好比對於DimCustomer的Address,每次都會將新的地址update到該字段,所以這個SCD實際上老是最新的當前信息,卻沒能包含歷史信息io
更新前:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position
101212 12345 Jack Developeremail
更新後:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position
101212 12345 Jack Managerdate
Type 2:經過添加記錄來將每一次變化都記錄到SCD中,每條記錄都有兩個字段(如Effective_start和Effective_end)代表該記錄的有效期間,而且能夠設定一個Active標誌位字段,當該字段爲True的時候代表這條記錄是最新的狀態,爲False的時候代表該記錄是歷史記錄,其有效期間能夠經過Effective_start和Effective_end字段來查im
更新前:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position start_date end_date
101212 12345 Jack Developer 2010-2-5 2012-6-12統計
更新後:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position start_date end_date
201245 12345 Jack Manager 2012-6-12數據
Type 3:經過對會發生變化的字段,添加相應的歷史字段,來記錄最近的變化而非所有變化。好比DimCustomer中有兩個字段Address和Address_Old,第一個字段是用戶的當前住址,後一個字段是用戶以前一次的住址,顯然,更久以前的信息就沒法追溯了
更新前:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position old_position
101212 12345 Jack Developer null
更新後:
emp_rid(代理鍵) emp_id(天然鍵) emp_name position old_position
101212 12345 Jack Manager Developer
Type 4:除了一個記錄當前信息的維度外,單獨創建一個歷史信息維度,該維度中須要包含有效期間字段(如Effective_start和Effective_end)
Type 5:能夠看到,對於Type 1/2/3,都是對於SCD中漸變屬性的處理方式,而針對一個包含多字段的複雜的SCD,可能須要結合以上三種處理方式。好比對於DimCustomer中的用戶聯繫方式屬性email,若是業務上並不重要,那麼這個字段能夠採起Type 1的方式,即每次只保留最新的聯絡方式,覆蓋原來的;假如業務中須要分析用戶所在地Region,那麼極可能須要用到Type 2,記錄每個Region的改變;而對於地址信息Address,可能並不須要追溯好久的變化,那麼加一個Address_Old字段來記錄上一次的住址就夠了