20世紀(jì)80年代末期,數(shù)據(jù)倉庫技術(shù)興起。自Ralph Kimball 于1996 年首次出版The Data Warehouse Toolkit(Wiley)一書以來,數(shù)據(jù)倉庫和商業(yè)智能(Data Warehousing and Business Intelligence, DW/BI)行業(yè)漸趨成熟幢痘。Kimball提出了數(shù)據(jù)倉庫的建模技術(shù)--維度建模(dimensional modelling),該方法是在實踐觀察的基礎(chǔ)上開發(fā)的。雖然它不基于任何理論家破,但是在實踐中卻非常成功颜说。維度建模被視為設(shè)計數(shù)據(jù)倉庫和數(shù)據(jù)集市的主要方法,對數(shù)據(jù)建模和數(shù)據(jù)庫設(shè)計學(xué)科有著重要的影響汰聋。時至今日脑沿,維度建模依然是構(gòu)建數(shù)倉首選的數(shù)據(jù)建模方法,但是隨著技術(shù)的發(fā)展马僻,獲取超強的存儲與計算能力的成本會變得很廉價庄拇。這在無形之中對傳統(tǒng)的維度建模方法產(chǎn)生了一定的影響。本文將討論以下內(nèi)容:
- 維度建模的概念
- 維度建模的優(yōu)缺點
- 為什么星型模型依然有用
- 數(shù)據(jù)建模發(fā)生了哪些變化
規(guī)則是用來被打破的
First learn the rules, then break them
維度建模的概念
事實表
事實表作為數(shù)據(jù)倉庫維度建模的核心,緊緊圍繞著業(yè)務(wù)過程來設(shè)計措近,通過獲取描述業(yè)務(wù)過程的度量來表達業(yè)務(wù)過程溶弟,包含了引用的維度和與業(yè)務(wù)過程有關(guān)的度量。
事實表中一條記錄所表達的業(yè)務(wù)細(xì)節(jié)程度被稱為粒度瞭郑。通常粒度可以通過兩種方式來表述:一種是維度屬性組合所表示的細(xì)節(jié)程度辜御;一種是所表示的具體業(yè)務(wù)含義。
作為度量業(yè)務(wù)過程的事實屈张,一般為整型或浮點型的十進制數(shù)值擒权,有可加性、半可加性和不可加性三種類型阁谆√汲可加性事實是指可以按照與事實表關(guān)聯(lián)的任意維度進行匯總。半可加性事實只能按照特定維度匯總场绿,不能對所有維度匯總,比如庫存可以按照地點和商品進行匯總焰盗,而按時間維度把一年中每個月的庫存累加起來則毫無意義璧尸。還有一種度量完全不具備可加性,比如比率型事實熬拒。對于不可加性事實可分解為可加的組件來實現(xiàn)聚集爷光。
事實表通常只有很少的列和很多行,是一種"瘦高"型的表澎粟。事實表定義為以下三種類型之一:
- 事務(wù)事實表:記錄有關(guān)特定事件的事實(例如蛀序,銷售事件,保存在原子的粒度捌议,也稱為原子事實表)
- 周期快照事實表記錄給定時間點的事實(例如哼拔,月末的帳戶詳細(xì)信息)
- 累積快照事實表記錄了給定時間點的匯總事實(例如,某產(chǎn)品的當(dāng)月迄今總銷售額)
維表
維度是維度建模的基礎(chǔ)和靈魂瓣颅。在維度建模中倦逐,將度量稱為事實,將環(huán)境描述為維度宫补,維度是用于分析事實所需要的多樣環(huán)境檬姥。例如,在分析交易過程時粉怕,可以通過買家健民、賣家、商品和時間等維度描述交易發(fā)生的環(huán)境贫贝。維度所包含的表示維度的列秉犹,稱為維度屬性蛉谜。維度屬性是查詢約束條件、分組和報表標(biāo)簽生成的基本來源崇堵,是數(shù)據(jù)易用性的關(guān)鍵型诚。
維度通常是限定事實的描述性信息。例如鸳劳,產(chǎn)品維度中的每個記錄代表一個特定的產(chǎn)品狰贯。與事實表相比,維表通常具有相對較少的記錄赏廓,但是每個記錄可能具有大量的屬性來描述事實數(shù)據(jù)涵紊。維度可以定義各種各樣的特征,一些常見的維表:
- 時間維度表:以最低時間粒度級別描述時間
- 地理維度表:描述了位置數(shù)據(jù)幔摸,例如國家/地區(qū)/城市
- 產(chǎn)品維度表:表描述了產(chǎn)品的詳細(xì)信息
- 員工維度表:描述了員工摸柄,例如銷售人員
星型模型
大多數(shù)的數(shù)據(jù)倉庫都采用星型模型。星型模型是由事實表和多個維表組成抚太。事實表中存放大量關(guān)于企業(yè)的事實數(shù)據(jù)塘幅,元祖?zhèn)€數(shù)通常很大昔案,而且非規(guī)范化程度很高尿贫。例如,多個時期的數(shù)據(jù)可能會出現(xiàn)在同一個表中踏揣。維表中通常存放描述性數(shù)據(jù)庆亡,維表是圍繞事實表建立的,通常來說具有較少的行捞稿。如下圖所示:
星型模型存取數(shù)據(jù)速度快又谋,主要是針對各個維做了大量預(yù)處理,如按照維度進行預(yù)先的統(tǒng)計娱局、分組合排序等彰亥。與規(guī)范化的關(guān)系型數(shù)據(jù)庫設(shè)計相比,星型模型是非規(guī)范化的衰齐,通過數(shù)據(jù)冗余提升多維數(shù)據(jù)的查詢速度任斋,增加了存儲空間的代價。當(dāng)業(yè)務(wù)問題發(fā)生變化耻涛、原來的維度不能滿足需求時废酷,需要增加新的維度。由于事實表的主鍵由所有維表的主鍵組成抹缕,這種維的變化帶來的數(shù)據(jù)變化將是非常復(fù)雜和耗時的澈蟆。一個星型模型的示例:
雪花模型
雪花模型是對星型模型的擴展,它將星型模型的維表進一步層次化卓研,原來的各個維表可能被擴展為小的事實表趴俘,形成一些局部的層次區(qū)域。在雪花模型中能夠定義多重父類維來描述某些特殊的維表,如在時間維上增加月維表和年維表寥闪,通過查看與時間有關(guān)的父類維带膀,能夠定義特殊的時間統(tǒng)計信息,如月統(tǒng)計和年統(tǒng)計等橙垢。
雪花模式通過更多的連接引入了更多的復(fù)雜性垛叨。隨著存儲變得越來越廉價,大多數(shù)情況柜某,一般不采用雪花模型
方法嗽元。
雪花模型的有點是最大限度地減少數(shù)據(jù)存儲量,以及把較小的維表聯(lián)合在一起來改善查詢性能喂击。但是它增加了用戶必須處理的表的數(shù)量剂癌,增加了某些查詢的復(fù)雜性。如下所示:
維度建模的優(yōu)缺點
優(yōu)點
- 每次需要從數(shù)據(jù)庫中獲取一些信息時翰绊,可以不用編寫冗長的查詢
- 針對讀取進行了優(yōu)化佩谷,可以寫更少的JOIN,更快地返回結(jié)果
缺點
- 對數(shù)據(jù)進行非規(guī)范化意味著一次性插入或更新會導(dǎo)致數(shù)據(jù)異常监嗜。在實踐中谐檀,星型模型是通過批處理實來彌補這一問題
- 分析靈活性有限。星型模型通常是為特定目的而設(shè)計的裁奇。在分析需求方面桐猬,它不像規(guī)范化數(shù)據(jù)模型那樣靈活
為什么星型模型依然有用
多種數(shù)據(jù)源
公司從各種數(shù)據(jù)源中收集越來越多的數(shù)據(jù),因此需要對結(jié)果數(shù)據(jù)集進行整理以進行分析刽肠,從而減少異構(gòu)數(shù)據(jù)源帶來的分析復(fù)雜性溃肪。
標(biāo)準(zhǔn)
由Ralph Kimball編寫的Data Warehouse Toolkit定義了業(yè)界廣泛理解的概念。新員工可以快速掌握數(shù)據(jù)倉庫的結(jié)構(gòu)音五,而無需熟悉具體的業(yè)務(wù)系統(tǒng)數(shù)據(jù)惫撰。數(shù)據(jù)工程師和分析師通常對事實、維度躺涝、粒度這些概念比較了解厨钻,從而可以促進協(xié)作。
可擴展性
新添加的事實表可以重用現(xiàn)有的維度诞挨。通過向事實表添加更多外鍵莉撇,實現(xiàn)向事實表添加新維度。另外惶傻,對于集成新的數(shù)據(jù)集棍郎,無需對模型進行重大調(diào)整。
數(shù)據(jù)建模發(fā)生了哪些變化
大數(shù)據(jù)時代银室,日新月異的技術(shù)發(fā)展促使存儲和計算發(fā)生了天翻地覆的變化(存儲和計算比以往任何時候都便宜)涂佃,因此數(shù)據(jù)模型也相應(yīng)地發(fā)生了一些變化励翼。
緩慢變化維(SCD)
對于隨時間而變化的維度,比如:用戶可以更改其家庭住址辜荠,產(chǎn)品可以更改名稱汽抚。所以需要一種策略保存歷史某個時間點對應(yīng)的維度信息。
Kimball書中介紹了許多類型的SCD策略伯病,大多數(shù)使用UPDATE就地添加或修改信息造烁。在保留歷史記錄的維度中,當(dāng)記錄中的任何屬性發(fā)生更改時午笛,都需要復(fù)制整行數(shù)據(jù),當(dāng)屬性經(jīng)常更改時惭蟋,同樣會使用更多存儲空間。值得注意的是药磺,這些技術(shù)很復(fù)雜告组,因為它們是在嚴(yán)格的存儲約束下設(shè)計的。
其實癌佩,可以使用維度快照來解決SCD的問題木缝,雖然需要更多的存儲空間,但創(chuàng)建和查詢更簡單围辙。
維度快照
維度應(yīng)比事實小得多我碟。電子商務(wù)的交易,訂單可能數(shù)以百萬/千萬計酌畜,但是客戶(維度)的數(shù)量會少得多怎囚。
每天我們都會在版本快照中重新寫入整個維度表
/data_warehouse/dim_users/ds = 2020-01-01
/data_warehouse/dim_users/ds = 2020-01-02
...
由于每天有一個快照數(shù)據(jù)卿叽,因此不管發(fā)生多少變化都沒有影響桥胞。這種方式非常簡單粗暴,但與復(fù)雜的不同類型的緩慢變化維策略相比考婴,不失為一種可選的方案贩虾。
使用此種方式,可以通過JOIN特定日期的維度快照來獲取歷史某個時間點的維度信息沥阱。另外缎罢,這種方式不會對查詢速度產(chǎn)生影響,因為通過分區(qū)日期可以直接定位選擇的日期考杉,而不是加載所有的數(shù)據(jù)策精。
系統(tǒng)地對維度進行快照(為每個ETL計劃周期存儲維度的完整副本,通常在不同的表分區(qū)中)崇棠,作為處理緩慢變化的維度(SCD)的通用方法咽袜,是一種簡單的通用方法,不需要太多的工程工作枕稀,并且與經(jīng)典方法相比询刹,在編寫ETL和查詢時很容易掌握谜嫉。 復(fù)雜的SCD建模技術(shù)并不直觀,并且會降低可訪問性凹联。
分區(qū)
為了避免上游數(shù)據(jù)處理錯誤導(dǎo)致事實表裝載錯誤沐兰,需要從數(shù)據(jù)源系統(tǒng)中提取日期作為分區(qū)字段,這樣可以實現(xiàn)數(shù)據(jù)裝載的冪等性蔽挠。此外住闯,建議按 事件日期 進行分區(qū),因為查詢通常會將其用作過濾器(WHERE子句)澳淑。
代理鍵與冗余維度
在維表中維護代理鍵是非常復(fù)雜的寞秃,除此之外,還會使事實表的可讀性變差偶惠。在事實表中使用自然鍵和維度冗余的方式越來越普遍春寿,這樣可以減少JOIN帶來的性能開銷。值得注意的是忽孽,支持編碼和壓縮的序列化格式(如Parquet绑改、ORC)解決了非規(guī)范化相關(guān)的大多數(shù)性能損失。
總結(jié)
本文主要介紹了維度建模的基本概念兄一,包括維表厘线、事實表、星型模型和雪花模型出革。其次對星型模型的優(yōu)缺點進行了闡述造壮。最后指出了維度建模正在發(fā)生的一些變化。
公眾號『大數(shù)據(jù)技術(shù)與數(shù)倉』骂束,回復(fù)『資料』領(lǐng)取大數(shù)據(jù)資料包