數(shù)倉(cāng)|大數(shù)據(jù)時(shí)代,維度建模過(guò)時(shí)了嗎?
點(diǎn)擊上方“數(shù)據(jù)管道”,選擇“置頂星標(biāo)”公眾號(hào)
干貨福利,第一時(shí)間送達(dá)

20世紀(jì)80年代末期,數(shù)據(jù)倉(cāng)庫(kù)技術(shù)興起。自Ralph Kimball 于1996 年首次出版The Data Warehouse Toolkit(Wiley)一書以來(lái),數(shù)據(jù)倉(cāng)庫(kù)和商業(yè)智能(Data Warehousing and Business Intelligence, DW/BI)行業(yè)漸趨成熟。Kimball提出了數(shù)據(jù)倉(cāng)庫(kù)的建模技術(shù)--維度建模(dimensional modelling),該方法是在實(shí)踐觀察的基礎(chǔ)上開發(fā)的。雖然它不基于任何理論,但是在實(shí)踐中卻非常成功。維度建模被視為設(shè)計(jì)數(shù)據(jù)倉(cāng)庫(kù)和數(shù)據(jù)集市的主要方法,對(duì)數(shù)據(jù)建模和數(shù)據(jù)庫(kù)設(shè)計(jì)學(xué)科有著重要的影響。時(shí)至今日,維度建模依然是構(gòu)建數(shù)倉(cāng)首選的數(shù)據(jù)建模方法,但是隨著技術(shù)的發(fā)展,獲取超強(qiáng)的存儲(chǔ)與計(jì)算能力的成本會(huì)變得很廉價(jià)。這在無(wú)形之中對(duì)傳統(tǒng)的維度建模方法產(chǎn)生了一定的影響。本文將討論以下內(nèi)容:
維度建模的概念 維度建模的優(yōu)缺點(diǎn) 為什么星型模型依然有用 數(shù)據(jù)建模發(fā)生了哪些變化
規(guī)則是用來(lái)被打破的!
維度建模的概念
事實(shí)表
事實(shí)表作為數(shù)據(jù)倉(cāng)庫(kù)維度建模的核心,緊緊圍繞著業(yè)務(wù)過(guò)程來(lái)設(shè)計(jì),通過(guò)獲取描述業(yè)務(wù)過(guò)程的度量來(lái)表達(dá)業(yè)務(wù)過(guò)程,包含了引用的維度和與業(yè)務(wù)過(guò)程有關(guān)的度量。
事實(shí)表中一條記錄所表達(dá)的業(yè)務(wù)細(xì)節(jié)程度被稱為粒度。通常粒度可以通過(guò)兩種方式來(lái)表述:一種是維度屬性組合所表示的細(xì)節(jié)程度;一種是所表示的具體業(yè)務(wù)含義。
作為度量業(yè)務(wù)過(guò)程的事實(shí),一般為整型或浮點(diǎn)型的十進(jìn)制數(shù)值,有可加性、半可加性和不可加性三種類型。可加性事實(shí)是指可以按照與事實(shí)表關(guān)聯(lián)的任意維度進(jìn)行匯總。半可加性事實(shí)只能按照特定維度匯總,不能對(duì)所有維度匯總,比如庫(kù)存可以按照地點(diǎn)和商品進(jìn)行匯總,而按時(shí)間維度把一年中每個(gè)月的庫(kù)存累加起來(lái)則毫無(wú)意義。還有一種度量完全不具備可加性,比如比率型事實(shí)。對(duì)于不可加性事實(shí)可分解為可加的組件來(lái)實(shí)現(xiàn)聚集。
事實(shí)表通常只有很少的列和很多行,是一種瘦高型的表。事實(shí)表定義為以下三種類型之一:
事務(wù)事實(shí)表:記錄有關(guān)特定事件的事實(shí)(例如,銷售事件,保存在原子的粒度,也稱為原子事實(shí)表) 周期快照事實(shí)表記錄給定時(shí)間點(diǎn)的事實(shí)(例如,月末的帳戶詳細(xì)信息) 累積快照事實(shí)表記錄了給定時(shí)間點(diǎn)的匯總事實(shí)(例如,某產(chǎn)品的當(dāng)月迄今總銷售額)
維表
維度是維度建模的基礎(chǔ)和靈魂。在維度建模中,將度量稱為事實(shí),將環(huán)境描述為維度,維度是用于分析事實(shí)所需要的多樣環(huán)境。例如,在分析交易過(guò)程時(shí),可以通過(guò)買家、賣家、商品和時(shí)間等維度描述交易發(fā)生的環(huán)境。維度所包含的表示維度的列,稱為維度屬性。維度屬性是查詢約束條件、分組和報(bào)表標(biāo)簽生成的基本來(lái)源,是數(shù)據(jù)易用性的關(guān)鍵。
維度通常是限定事實(shí)的描述性信息。例如,產(chǎn)品維度中的每個(gè)記錄代表一個(gè)特定的產(chǎn)品。與事實(shí)表相比,維表通常具有相對(duì)較少的記錄,但是每個(gè)記錄可能具有大量的屬性來(lái)描述事實(shí)數(shù)據(jù)。維度可以定義各種各樣的特征,一些常見的維表:
時(shí)間維度表:以最低時(shí)間粒度級(jí)別描述時(shí)間 地理維度表:描述了位置數(shù)據(jù),例如國(guó)家/地區(qū)/城市 產(chǎn)品維度表:表描述了產(chǎn)品的詳細(xì)信息 員工維度表:描述了員工,例如銷售人員
星型模型
大多數(shù)的數(shù)據(jù)倉(cāng)庫(kù)都采用星型模型。星型模型是由事實(shí)表和多個(gè)維表組成。事實(shí)表中存放大量關(guān)于企業(yè)的事實(shí)數(shù)據(jù),元祖?zhèn)€數(shù)通常很大,而且非規(guī)范化程度很高。例如,多個(gè)時(shí)期的數(shù)據(jù)可能會(huì)出現(xiàn)在同一個(gè)表中。維表中通常存放描述性數(shù)據(jù),維表是圍繞事實(shí)表建立的,通常來(lái)說(shuō)具有較少的行。如下圖所示:

星型模型存取數(shù)據(jù)速度快,主要是針對(duì)各個(gè)維做了大量預(yù)處理,如按照維度進(jìn)行預(yù)先的統(tǒng)計(jì)、分組合排序等。與規(guī)范化的關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)相比,星型模型是非規(guī)范化的,通過(guò)數(shù)據(jù)冗余提升多維數(shù)據(jù)的查詢速度,增加了存儲(chǔ)空間的代價(jià)。當(dāng)業(yè)務(wù)問(wèn)題發(fā)生變化、原來(lái)的維度不能滿足需求時(shí),需要增加新的維度。由于事實(shí)表的主鍵由所有維表的主鍵組成,這種維的變化帶來(lái)的數(shù)據(jù)變化將是非常復(fù)雜和耗時(shí)的。一個(gè)星型模型的示例:

雪花模型
雪花模型是對(duì)星型模型的擴(kuò)展,它將星型模型的維表進(jìn)一步層次化,原來(lái)的各個(gè)維表可能被擴(kuò)展為小的事實(shí)表,形成一些局部的層次區(qū)域。在雪花模型中能夠定義多重父類維來(lái)描述某些特殊的維表,如在時(shí)間維上增加月維表和年維表,通過(guò)查看與時(shí)間有關(guān)的父類維,能夠定義特殊的時(shí)間統(tǒng)計(jì)信息,如月統(tǒng)計(jì)和年統(tǒng)計(jì)等。
雪花模式通過(guò)更多的連接引入了更多的復(fù)雜性。隨著存儲(chǔ)變得越來(lái)越廉價(jià),大多數(shù)情況,一般不采用雪花模型方法。
雪花模型的有點(diǎn)是最大限度地減少數(shù)據(jù)存儲(chǔ)量,以及把較小的維表聯(lián)合在一起來(lái)改善查詢性能。但是它增加了用戶必須處理的表的數(shù)量,增加了某些查詢的復(fù)雜性。如下所示:

維度建模的優(yōu)缺點(diǎn)
優(yōu)點(diǎn)
每次需要從數(shù)據(jù)庫(kù)中獲取一些信息時(shí),可以不用編寫冗長(zhǎng)的查詢 針對(duì)讀取進(jìn)行了優(yōu)化,可以寫更少的JOIN,更快地返回結(jié)果
缺點(diǎn)
對(duì)數(shù)據(jù)進(jìn)行非規(guī)范化意味著一次性插入或更新會(huì)導(dǎo)致數(shù)據(jù)異常。在實(shí)踐中,星型模型是通過(guò)批處理實(shí)來(lái)彌補(bǔ)這一問(wèn)題 分析靈活性有限。星型模型通常是為特定目的而設(shè)計(jì)的。在分析需求方面,它不像規(guī)范化數(shù)據(jù)模型那樣靈活
為什么星型模型依然有用
多種數(shù)據(jù)源
公司從各種數(shù)據(jù)源中收集越來(lái)越多的數(shù)據(jù),因此需要對(duì)結(jié)果數(shù)據(jù)集進(jìn)行整理以進(jìn)行分析,從而減少異構(gòu)數(shù)據(jù)源帶來(lái)的分析復(fù)雜性。
標(biāo)準(zhǔn)
由Ralph Kimball編寫的Data Warehouse Toolkit定義了業(yè)界廣泛理解的概念。新員工可以快速掌握數(shù)據(jù)倉(cāng)庫(kù)的結(jié)構(gòu),而無(wú)需熟悉具體的業(yè)務(wù)系統(tǒng)數(shù)據(jù)。數(shù)據(jù)工程師和分析師通常對(duì)事實(shí)、維度、粒度這些概念比較了解,從而可以促進(jìn)協(xié)作。
可擴(kuò)展性
新添加的事實(shí)表可以重用現(xiàn)有的維度。通過(guò)向事實(shí)表添加更多外鍵,實(shí)現(xiàn)向事實(shí)表添加新維度。另外,對(duì)于集成新的數(shù)據(jù)集,無(wú)需對(duì)模型進(jìn)行重大調(diào)整。
數(shù)據(jù)建模發(fā)生了哪些變化
大數(shù)據(jù)時(shí)代,日新月異的技術(shù)發(fā)展促使存儲(chǔ)和計(jì)算發(fā)生了天翻地覆的變化(存儲(chǔ)和計(jì)算比以往任何時(shí)候都便宜),因此數(shù)據(jù)模型也相應(yīng)地發(fā)生了一些變化。
緩慢變化維(SCD)
對(duì)于隨時(shí)間而變化的維度,比如:用戶可以更改其家庭住址,產(chǎn)品可以更改名稱。所以需要一種策略保存歷史某個(gè)時(shí)間點(diǎn)對(duì)應(yīng)的維度信息。
Kimball書中介紹了許多類型的SCD策略,大多數(shù)使用UPDATE就地添加或修改信息。在保留歷史記錄的維度中,當(dāng)記錄中的任何屬性發(fā)生更改時(shí),都需要復(fù)制整行數(shù)據(jù),當(dāng)屬性經(jīng)常更改時(shí),同樣會(huì)使用更多存儲(chǔ)空間。值得注意的是,這些技術(shù)很復(fù)雜,因?yàn)樗鼈兪窃趪?yán)格的存儲(chǔ)約束下設(shè)計(jì)的。
其實(shí),可以使用維度快照來(lái)解決SCD的問(wèn)題,雖然需要更多的存儲(chǔ)空間,但創(chuàng)建和查詢更簡(jiǎn)單。
維度快照
維度應(yīng)比事實(shí)小得多。電子商務(wù)的交易,訂單可能數(shù)以百萬(wàn)/千萬(wàn)計(jì),但是客戶(維度)的數(shù)量會(huì)少得多。
每天我們都會(huì)在版本快照中重新寫入整個(gè)維度表
/data_warehouse/dim_users/ds?=?2020-01-01
/data_warehouse/dim_users/ds?=?2020-01-02?
...
由于每天有一個(gè)快照數(shù)據(jù),因此不管發(fā)生多少變化都沒(méi)有影響。這種方式非常簡(jiǎn)單粗暴,但與復(fù)雜的不同類型的緩慢變化維策略相比,不失為一種可選的方案。
使用此種方式,可以通過(guò)JOIN特定日期的維度快照來(lái)獲取歷史某個(gè)時(shí)間點(diǎn)的維度信息。另外,這種方式不會(huì)對(duì)查詢速度產(chǎn)生影響,因?yàn)橥ㄟ^(guò)分區(qū)日期可以直接定位選擇的日期,而不是加載所有的數(shù)據(jù)。
系統(tǒng)地對(duì)維度進(jìn)行快照(為每個(gè)ETL計(jì)劃周期存儲(chǔ)維度的完整副本,通常在不同的表分區(qū)中),作為處理緩慢變化的維度(SCD)的通用方法,是一種簡(jiǎn)單的通用方法,不需要太多的工程工作,并且與經(jīng)典方法相比,在編寫ETL和查詢時(shí)很容易掌握。復(fù)雜的SCD建模技術(shù)并不直觀,并且會(huì)降低可訪問(wèn)性。
分區(qū)
為了避免上游數(shù)據(jù)處理錯(cuò)誤導(dǎo)致事實(shí)表裝載錯(cuò)誤,需要從數(shù)據(jù)源系統(tǒng)中提取日期作為分區(qū)字段,這樣可以實(shí)現(xiàn)數(shù)據(jù)裝載的冪等性。此外,建議按 事件日期 進(jìn)行分區(qū),因?yàn)椴樵兺ǔ?huì)將其用作過(guò)濾器(WHERE子句)。
代理鍵與冗余維度
在維表中維護(hù)代理鍵是非常復(fù)雜的,除此之外,還會(huì)使事實(shí)表的可讀性變差。在事實(shí)表中使用自然鍵和維度冗余的方式越來(lái)越普遍,這樣可以減少JOIN帶來(lái)的性能開銷。值得注意的是,支持編碼和壓縮的序列化格式(如Parquet、ORC)解決了非規(guī)范化相關(guān)的大多數(shù)性能損失。
總結(jié)
本文主要介紹了維度建模的基本概念,包括維表、事實(shí)表、星型模型和雪花模型。其次對(duì)星型模型的優(yōu)缺點(diǎn)進(jìn)行了闡述。最后指出了維度建模正在發(fā)生的一些變化。
