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

2021-10-05 10:47:37 字數 4336 閱讀 9831

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

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

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

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

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

比如商品所屬**商:a商品的**渠道是某**商,隨著時間推移可能轉款到b**商(由b**商來供貨),此種情況如果關注的是原始最初**的**商,則採用方式0。

修改維度屬性為最新值,直接覆蓋,不保留歷史資訊。

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

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

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

比如

維度屬性值變化前:

商品鍵(**鍵)

商品唯一鍵(自然鍵)

品類行生效時間

行失效時間

當前行標識

1spu001

科技2020-01-01

9999-12-31

1維度屬性值變化後:

商品鍵(**鍵)

商品唯一鍵(自然鍵)

品類行生效時間

行失效時間

當前行標識

1spu001

科技2020-01-01

2020-01-3103

spu001

教育2020-02-01

9999-12-31

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

比如

維度屬性值變化前:

商品唯一鍵

品類spu001

科技維度屬性值變化後:

商品唯一鍵

當前品類

原先品類

spu001

教育科技

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

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

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

rfm微型維度:

rfm鍵

最近一次消費

消費頻率

消費金額

17天內

>=月均5次

>=10000

230天內

>=月均5次

>=10000

3超過乙個月

>=月均5次

>=10000

47天內

>=月均1次

>=10000

530天內

>=月均1次

>=10000

6超過乙個月

>=月均1次

>=10000……

……日期鍵使用者鍵

rfm鍵

其他外來鍵

事實20200501

00001

1***

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

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

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

如方式4中的例子,我們再將rfm鍵新增至主維度(使用者維度表)中作為外來鍵,以方式1進行更新,即為方式5

使用者維度表:

使用者鍵使用者名稱

其他屬性

rfm鍵

00001張三…

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

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

如商品的品類變化

品類變化前:

商品鍵(**鍵)

商品唯一鍵(自然鍵)

歷史品類

當前品類

行生效時間

行失效時間

當前行標識

1spu001

科技科技

2020-01-01

9999-12-31

1品類變化後:

商品鍵(**鍵)

商品唯一鍵(自然鍵)

歷史品類

當前品類

行生效時間

行失效時間

當前行標識

1spu001

科技教育

2020-01-01

2020-01-31014

spu001

教育教育

2020-02-01

9999-12-31

1品類再度變化後:

商品鍵(**鍵)

商品唯一鍵(自然鍵)

歷史品類

當前品類

行生效時間

行失效時間

當前行標識

1spu001

科技教材

2020-01-01

2020-01-31014

spu001

教育教材

2020-02-01

2020-03-31

0235

spu001

教材教材

2020-04-01

9999-12-31

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

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

如以商品維度為例

方式2維度表(包含歷史資訊)

商品鍵(**鍵)

商品唯一鍵(自然鍵)

品類其他屬性

行生效時間

行失效時間

當前行標識

1spu001

科技***

2020-01-01

2020-01-3103

spu001

教育***

2020-02-01

9999-12-31

1相關事實表

日期鍵商品鍵(**鍵)(外來鍵)

商品唯一鍵(自然鍵)(外來鍵)

其他外來鍵

事實20200111

1spu001

***10

20200501

3spu001

***10

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

商品唯一鍵(自然鍵)

當前品類

其他屬性

spu001

教育***

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

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

如商品快照維度表

日期鍵商品唯一鍵(自然鍵)

品類其他屬性

20200101

spu001

科技***

20200102

spu001

科技***……

……20200201

spu001

教育***……

……20200501

spu001

教材***

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

但捨棄了**鍵,因為如mapreduce之類的分布式計算引擎,維護全域性唯一的**鍵難度大,成本高。

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

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

商品唯一鍵(自然鍵)

品類行生效時間

行失效時間

spu001

科技2020-01-01

2020-01-31

spu001

教育2020-02-01

9999-12-31

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

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

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

我碰到的面試官

1 奇葩找踹型 這種型別呢會有一種高高在上的感覺,總喜歡用問題把你擊倒,有時候問題描述的也不是很清晰,在交談的過程中一股無名火總會湧上心頭,總想下去踹他兩腳。2 豪爽奔放型 一般這種人呢會跟你有良好的互動,跟你聊的比較high,聊的過程中會頻頻點頭示意,討論氣氛也是熱烈融洽,但是呢,這樣的人往往都是...

面試官問到TCP IP怎麼回答才過關

眾所周知,關於tcp ip,互網網興起時,就已經跟網際網路人的生活息息相關,那麼作為一名前端開發者來說,對於tcp ip的知識,是否需要深度理解,作者可以毫無疑問的告訴你,有關tcp ip的知識,你真的需要知道並深入了解。對於一位前端開發者來說,更是有必要了解,現在各大名廠,面試必問,那接下來,我們...

面試官,我有問題要問

面對面試主管咄咄逼人的提問,你已經感到緊張萬分,只盼能早點結束,根本無暇去提 什麼問題,要問也只是泛泛地提一些類似醫療 保險 上下班時間的問題,然後就是一 句話 我沒有什麼要問的了。事實上,接受面試者想對面試單位提的問題應該有很多,而在面試時不提則會給有經驗 的面試者留下你太欠缺職業素養的印象,同時...