接上一篇:《大數(shù)據(jù)之路》讀書筆記:維度設(shè)計(jì)
緩慢變化維
這個應(yīng)該是知名度最高的扫步,“緩慢變化”也是經(jīng)常會被提起的一個場景魔策。隨著時間的變化,有一些維度是會變的河胎,就像商品維度闯袒,經(jīng)常有新商品上架,有商品下架,所以要看某一天在線的商品政敢,就需要用緩慢變化維的方式來處理其徙。
反映歷史變化也是數(shù)倉的特性之一,為了應(yīng)對這種變化喷户,有幾種處理方式:
重寫維度值
如果我不關(guān)心歷史數(shù)據(jù)唾那,當(dāng)屬性變化了,那我就看最新的數(shù)據(jù)褪尝,不管歷史是什么的話闹获,我就可以直接去更新維度數(shù)據(jù)。
比如商品A河哑,它原來叫礦泉水避诽,后來改成礦物質(zhì)水,直接更新就好了灾馒,這時候維度表會只存有一份最新的數(shù)據(jù)茎用。插入新的維度行
當(dāng)我們需要關(guān)注維度的歷史數(shù)據(jù)的時候,我們就不能采取直接更新的方式了睬罗,我們可以通過新增記錄的方式來解決轨功,這樣老的數(shù)據(jù)還在,新的數(shù)據(jù)也有容达。
這里要注意的是唯一建的問題古涧,業(yè)務(wù)系統(tǒng)在更新維度信息的時候,很可能是直接更新掉花盐,數(shù)倉中需要維護(hù)歷史數(shù)據(jù)羡滑,所以在新增記錄的時候如果沒有代理鍵,要注意key值的唯一性算芯,這種方法一般是需要代理鍵的柒昏,像上面說的商品修改名稱,商品的業(yè)務(wù)key可能還是101熙揍,但是數(shù)倉中需要使用代理鍵來保證key值一致职祷,但是代理鍵不同,這樣才可以讓事實(shí)表中的數(shù)據(jù)老數(shù)據(jù)使用老的代理鍵届囚,新數(shù)據(jù)使用新的代理鍵有梆。
這種方式也會有些問題,就是單獨(dú)來看維度數(shù)據(jù)的話意系,同一個商品會有多條記錄泥耀,會產(chǎn)生歧義;還有一點(diǎn)就是從維度表中可能看不出來記錄的變化過程蛔添,并不清楚某一天該商品到底是哪一條記錄為準(zhǔn)痰催,因?yàn)樽兓奶卣鞫荚谑聦?shí)表中兜辞。添加維度列
這個算是一種延伸的方法,類似方法一陨囊,為了讓方法一可以存歷史數(shù)據(jù)弦疮,除了新增記錄(縱向),還可以采用橫向的方式蜘醋,就是新增字段(列)胁塞,來記錄變化前的記錄,這樣通過一條記錄压语,就可以記錄商品變化前和變化后的數(shù)據(jù)了啸罢。
這樣可以保證key值唯一,但是缺點(diǎn)也顯而易見胎食,只能記錄有限次數(shù)的變化扰才,而且要提前規(guī)劃好,保留幾次歷史記錄厕怜。拉鏈表
還有一種常用的方式是拉鏈表衩匣,這種方式類似第2種方法,算是拓展版粥航,也有點(diǎn)兒麻煩琅捏,簡單來說,就是需要新增兩個字段递雀,start_date柄延,end_date,用來記錄這條就的有效周期缀程,從哪一天開始搜吧,哪一天結(jié)束,使用的時候用這兩個字段一過濾就好了杨凑。
在實(shí)際應(yīng)用時滤奈,還是要考慮業(yè)務(wù)場景,根據(jù)實(shí)際情況選擇撩满,當(dāng)然還有其他的方式僵刮,同樣后面會再更新。
快照維度
上面說到了代理鍵鹦牛,這個東西是很復(fù)雜的,按照維度建模的理論來勇吊,是需要搞一套代理鍵的曼追,而實(shí)際操作起來會增加復(fù)雜度和維護(hù)成本,阿里采用的這種快照方式汉规,也可以解決緩慢變化的問題礼殊。
以商品維度為例驹吮,就是每天都對商品維度生成一個快照,這樣每天的商品信息都有了晶伦,key值也是唯一的碟狞,我想要看哪天的記錄就看哪天,而且非常簡單婚陪,使用也方便族沃,就當(dāng)前存儲價格很便宜,這種方法最實(shí)用泌参,當(dāng)前公司也是使用這種方式脆淹,每天搞個分區(qū),全量的快照沽一,想用最新的就用最新的盖溺,想用歷史的就用歷史的。
當(dāng)然它的缺點(diǎn)也明顯铣缠,就是時間久了烘嘱,歷史數(shù)據(jù)非常龐大,有一定的存儲浪費(fèi)蝗蛙,需要注意對歷史數(shù)據(jù)歸檔或清理蝇庭。
極限存儲
這個應(yīng)該是阿里自己的一套實(shí)踐方案,上面拉鏈表的方式歼郭,有幾個缺點(diǎn)遗契,一個是下游用戶理解起來會稍有問題,需要一些解釋成本病曾,還有一個是使用start_date和end_date做分區(qū)的話牍蜂,會有分區(qū)數(shù)量的限制,為了解決這些問題泰涂,阿里使用極限存儲的方式來解決鲫竞。
首先是在拉鏈表上層做了一層處理,讓下游使用起來和每天一個快照的方式一樣逼蒙,方便使用从绘;
然后是分月做歷史拉鏈表,我感覺書上這里寫的有點(diǎn)兒問題是牢,或者是我還沒理解僵井,詳情看看書吧。
微型維度
微型維度是為了解決維度屬性頻繁變化的問題驳棱,如果維度中有些屬性經(jīng)常會發(fā)生變化批什,可以將他們抽取出來,放到一個新維度表中社搅,我覺這里說的也不是很好驻债,看書中的意思乳规,感覺和下面那個雜項(xiàng)維度差不多,思路是一樣的合呐,這里不過是將頻繁變化的屬性抽取出來暮的,然后通過笛卡爾積生成所有記錄,然后用代理鍵去關(guān)聯(lián)淌实。
遞歸維度
維度的遞歸問題冻辩,一般是業(yè)務(wù)系統(tǒng)中,開發(fā)的同學(xué)會這樣設(shè)計(jì)翩伪。像類目或者組織架構(gòu)這種微猖,一般是有上下級關(guān)系的,除了設(shè)計(jì)成類似雪花那樣的多個表缘屹,還會設(shè)計(jì)成遞歸存儲的這種凛剥,這種維度,到數(shù)倉中轻姿,是需要處理下的犁珠。哦,這里會暈倒兩種類型互亮,一種是“均衡層次結(jié)構(gòu)”犁享,一種是“非均衡層次結(jié)構(gòu)”。
扁平化
就是將維度數(shù)據(jù)打平豹休,變成一張寬表炊昆,數(shù)據(jù)會冗余,但是使用起來非常方便威根。以商品維度來說凤巨,就是商品ID,商品名稱洛搀、一級品類ID敢茁、一級品類名稱、二級品類ID留美、二級品類名稱......層級橋接表
這個方式到是沒有用過彰檬,相比扁平化操作更加的靈活。
這種方式需要搞一個橋接表谎砾,就是個映射關(guān)系表逢倍,用父、子關(guān)系和父子之間相隔的層級數(shù)來記錄景图。
這種方式還是需要一個扁平化的表较雕,只是又搞了一個中間表。
書中有說到症歇,選擇哪一種方法的時候郎笆,要考慮實(shí)際應(yīng)用,比如上鉆忘晤、下鉆是怎樣實(shí)現(xiàn)的宛蚓,和前端也會有些關(guān)系。
行為維度
這個不是直接存在于業(yè)務(wù)中的維度设塔,而是通過其他業(yè)務(wù)梳理出來或者衍生出來的維度凄吏,這些維度是通過某種計(jì)算規(guī)則統(tǒng)計(jì)出來的,而不是原生存在的闰蛔,可以分為幾種:
- 另一個維度的過去行為
買家最近一次訪問淘寶的時間痕钢、買家最近一次發(fā)生交易行為的時間 - 快照事實(shí)行為維度
買家從年初至今的淘寶交易金額、買家信用值 - 分組事實(shí)行為維度
買家從年初至今的淘寶交易金額劃分的等級序六、買家信用值等級 - 復(fù)雜邏輯事實(shí)行為維度
通過復(fù)雜算法或加工多個事實(shí)輸出的維度
實(shí)際處理這種維度時任连,可以增加到當(dāng)前類似的維度表中,或者新增維度例诀。需要注意維度的變化頻率和耦合性随抠,后期維護(hù)成本等。
多值維度
這個主要是事實(shí)表和維度表粒度的不一致的問題繁涂,書中舉的例子是訂單主表和訂單明細(xì)表拱她,一筆訂單會購買多個商品。有幾種處理方式:
- 降低事實(shí)表粒度
像上面的例子扔罪,直接以訂單明細(xì)為最細(xì)粒度 - 采用多字段
有些場景下對應(yīng)的多維度可能是可確定的秉沼,比如兩個、三個等矿酵,可以通過增加字段的形式唬复。比如我一單只會買兩種商品,那就可以設(shè)計(jì)為第一種商品和第二種商品了坏瘩。 - 橋接表
更加靈活盅抚,但是復(fù)雜度高。
多屬性維度
這個是說維度的某個屬性會有多個值倔矾,比如同一件商品它的顏色妄均、尺寸會有多個。
我看書中的意思是沒有使用最細(xì)粒度哪自,如果都是sku粒度丰包,這些都是唯一的,沒有什么問題壤巷,把這些屬性都作為sku的一個屬性即可邑彪,這是最方便的,但是數(shù)據(jù)量會增加很多胧华。
- 將多屬性使用key-value的形式存在一個字段中
這樣粒度不變寄症,處理方便宙彪,但是使用的時候有點(diǎn)兒復(fù)雜 - 將多屬性放在多個字段中
前面也說過真竖,拆成多個字段耻瑟,第一渡冻、第二剃袍、第三等狰闪,這樣的缺點(diǎn)是拓展性不好祈远。 - 使用最細(xì)的sku粒度
就是上面說的最細(xì)粒度數(shù)據(jù)挠铲,使用方便筹误,需要關(guān)注下數(shù)據(jù)量的問題甜橱。
雜項(xiàng)維度
Junk Dimension逊笆,這個雜項(xiàng)維度和印象中的不太一樣,忘了以前從哪兒看到的岂傲,或者是記錯了难裆,我記憶中是這樣用的:
建模過程中,有很多小維度譬胎,分開建成獨(dú)立的維度的話差牛,顯得很多,很雜亂堰乔,所以就講這些維度放到一個維度下面偏化,統(tǒng)一管理。
而從目前的書中來看镐侯,有些不太對侦讨。
雜項(xiàng)維度的確是用來處理一些標(biāo)志位,或者狀態(tài)像0苟翻、1韵卤,Y、N這種描述性維度崇猫,支付轉(zhuǎn)態(tài)沈条、物流狀態(tài)等,為了不讓維度過多诅炉,就建立一個雜項(xiàng)維度蜡歹,就是將這些維度整合成一個維度,通過笛卡爾積的形式生成記錄涕烧。
就是將整合的多個維度記錄月而,通過笛卡爾積的形式覆蓋所有情況。