我回答面試官,說緩慢變化維有10種處理方式,他驚了

顧名思義,緩慢變化維(Slowly Changing Dimension)就是變化相對緩慢(相對與快速變化的事實表來說)的維度。

在維度建模理論中,有8種處理方式,包括基礎的5種以及混合的3種。

再加上大數據時代的2種極限型,共10種,具體如下:

1 基礎型

1.1 方式0:保留原始值

維度屬性值不做更改,保留原始值。

此方式什麼也不做,所以稱之爲方式0。

  • 比如商品上架售賣時間:一個商品上架售賣後可能由於缺貨下架,補充庫存後又再次上架,此種情況產生了多個商品上架售賣時間。如果重點關注的是商品首次上架售賣時間,則採用方式0。
  • 比如商品所屬供應商:a商品的供應渠道是某供應商,隨着時間推移可能轉款到b供應商(由b供應商來供貨),此種情況如果關注的是原始最初供應的供應商,則採用方式0。

1.2 方式1:直接覆蓋

修改維度屬性爲最新值,直接覆蓋,不保留歷史信息。

  • 比如商品屬於哪個品類:當商品品類發生變化時,直接重寫爲新品類,如果業務只關心最新的品類。

1.3 方式2:增加新行

在維度表中增加新的一行,新行中採用新的屬性值。此種方式需要藉助代理鍵,需要爲新行分配新的代理鍵,將其作爲事實表的外鍵。

採用此方式,一般會在維度行中額外增加3列:行生效時間,行失效時間以及當前行標識(或者不使用當前行標識,由行失效時間來判斷是否是當前行)

此方式及其變種是處理緩慢變化維的主要技術。

比如

維度屬性值變化前:

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 品類 行生效時間 行失效時間 當前行標識
1 SPU001 科技 2020-01-01 9999-12-31 1

維度屬性值變化後:

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 品類 行生效時間 行失效時間 當前行標識
1 SPU001 科技 2020-01-01 2020-01-31 0
3 SPU001 教育 2020-02-01 9999-12-31 1

1.4 方式3:增加新屬性列

在維度表中增加新的一列,原先屬性列存放上一版本的屬性值,當前屬性列存放當前版本的屬性值。

比如

維度屬性值變化前:

商品唯一鍵 品類
SPU001 科技

維度屬性值變化後:

商品唯一鍵 當前品類 原先品類
SPU001 教育 科技

1.5 方式4:增加微型維度

當某維表是一個大型維度表,採用方式2時,如果某些維度屬性變化相對較快,會導致該維表變得越來越大,導致存儲壓力和性能壓力。

此時引入微型維度是一個不錯的選擇,將某些維度屬性從該大型維表中抽離出來,單獨構建微型維度。

比如將用戶最近消費時間、消費頻率、消費金額從用戶維表中剝離出來,並結合業務以區間段形式表現,單獨構建成RFM微型維度,並在相關事實表中增加RFM鍵作爲外鍵

RFM微型維度:

RFM鍵 最近一次消費 消費頻率 消費金額
1 7天內 >=月均5次 >=10000
2 30天內 >=月均5次 >=10000
3 超過一個月 >=月均5次 >=10000
4 7天內 >=月均1次 >=10000
5 30天內 >=月均1次 >=10000
6 超過一個月 >=月均1次 >=10000

相關事實表:

日期鍵 用戶鍵 RFM鍵 其他外鍵 事實
20200501 00001 1 XXX 10

2 混合型

2.1 方式5:微型維度與方式1支架表

該方式是方式1和方式4的結合,即建立微型維度後,微型維度的主鍵不僅作爲事實表的外鍵,也作爲主維度的外鍵。

在主維度中,此微型維度屬性以方式1處理,即當該屬性發生變化時,直接覆蓋,不保留歷史信息。

這種情況下的微型維度被稱之爲支架。

如方式4中的例子,我們再將RFM鍵添加至主維度(用戶維度表)中作爲外鍵,以方式1進行更新,即爲方式5

用戶維度表:

用戶鍵 用戶名稱 其他屬性 RFM鍵
00001 張三 1

2.2 方式6:將方式1屬性增加到方式2維度

該方式是方式1、2、3的結合,即同時增加維度行和維度列,並以方式1處理新加的維度列(當前屬性)。

此種方式複雜,在少數特定迫切的場景下才會使用。

如商品的品類變化

品類變化前:

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 歷史品類 當前品類 行生效時間 行失效時間 當前行標識
1 SPU001 科技 科技 2020-01-01 9999-12-31 1

品類變化後:

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 歷史品類 當前品類 行生效時間 行失效時間 當前行標識
1 SPU001 科技 教育 2020-01-01 2020-01-31 0
14 SPU001 教育 教育 2020-02-01 9999-12-31 1

品類再度變化後:

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 歷史品類 當前品類 行生效時間 行失效時間 當前行標識
1 SPU001 科技 教材 2020-01-01 2020-01-31 0
14 SPU001 教育 教材 2020-02-01 2020-03-31 0
235 SPU001 教材 教材 2020-04-01 9999-12-31 1

2.3 方式7:雙重外鍵並且方式1與方式2結合

在方式2的基礎上,不僅是維度的代理鍵作爲事實表外鍵,維度的自然鍵(如果自然鍵會被重新分配,發生變化,應該使用持續性超自然鍵)也同時作爲事實表外鍵。

事實表通過代理鍵連接維表獲取歷史維度屬性,通過自然鍵連接維表獲取當前維度屬性。

如以商品維度爲例

方式2維度表(包含歷史信息)

商品鍵(代理鍵) 商品唯一鍵(自然鍵) 品類 其他屬性 行生效時間 行失效時間 當前行標識
1 SPU001 科技 xxx 2020-01-01 2020-01-31 0
3 SPU001 教育 xxx 2020-02-01 9999-12-31 1

相關事實表

日期鍵 商品鍵(代理鍵)(外鍵) 商品唯一鍵(自然鍵)(外鍵) 其他外鍵 事實
20200111 1 SPU001 XXX 10
20200501 3 SPU001 XXX 10

方式1維度表(當前信息)(可以基於方式2維度表建立視圖形式產生,篩選當前行標識=1的記錄即爲當前信息)

商品唯一鍵(自然鍵) 當前品類 其他屬性
SPU001 教育 xxx

3 極限型

3.1 方式8:快照維度

此種方式比較暴力,每天保留全量維度屬性的快照數據,自然鍵及日期鍵作爲事實表的外鍵。

此方式依託的是當前存儲成本遠低於計算成本,以空間換時間的理念。

如商品快照維度表

日期鍵 商品唯一鍵(自然鍵) 品類 其他屬性
20200101 SPU001 科技 xxx
20200102 SPU001 科技 xxx
20200201 SPU001 教育 xxx
20200501 SPU001 教材 xxx

3.2 方式9:歷史拉鍊維度

此方式是方式2的閹割版,同樣是增加維度行。

但捨棄了代理鍵,因爲如MapReduce之類的分佈式計算引擎,維護全局唯一的代理鍵難度大,成本高。

優點是此方式相比方式8,大大降低了存儲(當然前提是不包含變化頻率很高的維度屬性,如果有,請考慮進行垂直拆分)。

缺點是和事實表連接時會有一些不足。如事實表只能以時間切片的方式和維度表進行連接,如果事實表要多個時間切片同時與維度表關聯,需要一定的技術改造。

商品唯一鍵(自然鍵) 品類 行生效時間 行失效時間
SPU001 科技 2020-01-01 2020-01-31
SPU001 教育 2020-02-01 9999-12-31

4 結語

以上就是針對緩慢變化維的10種處理方式了。

隨着數據技術的發展,維度建模方法也不是一成不變的,需要結合當前技術的特點進行靈活轉變。

總之,沒有最牛x的建模方法論,只有最適合的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章