深入理解數(shù)據(jù)倉(cāng)庫(kù)建模
數(shù)據(jù)模型就是數(shù)據(jù)組織和存儲(chǔ)方法,它強(qiáng)調(diào)從業(yè)務(wù)、數(shù)據(jù)存取和使用角度合理存儲(chǔ)數(shù)據(jù)。Linux的創(chuàng)始人Torvalds有一段關(guān)于“什么才是優(yōu)秀程序員”的話:“爛程序員關(guān)心的是代碼,好程序員關(guān)心的是數(shù)據(jù)結(jié)構(gòu)和它們之間的關(guān)系”,最能夠說明數(shù)據(jù)模型的重要性。
只有數(shù)據(jù)模型將數(shù)據(jù)有序的組織和存儲(chǔ)起來之后,大數(shù)據(jù)才能得到高性能、低成本、高效率、高質(zhì)量的使用。
成本:極大地減少不必要的數(shù)據(jù)冗余,也能實(shí)現(xiàn)計(jì)算結(jié)果復(fù)用,極大地降低存儲(chǔ)和計(jì)算成本。
效率:在業(yè)務(wù)或系統(tǒng)發(fā)生變化時(shí),可以保持穩(wěn)定或很容易擴(kuò)展,提高數(shù)據(jù)穩(wěn)定性和連續(xù)性。
質(zhì)量:良好的數(shù)據(jù)模型能改善數(shù)據(jù)統(tǒng)計(jì)口徑的不一致性,減少數(shù)據(jù)計(jì)算錯(cuò)誤的可能性。
數(shù)據(jù)模型能夠促進(jìn)業(yè)務(wù)與技術(shù)進(jìn)行有效溝通,形成對(duì)主要業(yè)務(wù)定義和術(shù)語的統(tǒng)一認(rèn)識(shí),具有跨部門、中性的特征,可以表達(dá)和涵蓋所有的業(yè)務(wù)。
大數(shù)據(jù)系統(tǒng)需要數(shù)據(jù)模型方法來幫助更好地組織和存儲(chǔ)數(shù)據(jù),以便在性能、成本、效率和質(zhì)量之間取得最佳平衡!
下圖是個(gè)示例,通過統(tǒng)一數(shù)據(jù)模型,屏蔽數(shù)據(jù)源變化對(duì)業(yè)務(wù)的影響,保證業(yè)務(wù)的穩(wěn)定,表述了數(shù)據(jù)倉(cāng)庫(kù)模型的一種價(jià)值:

以下是我們的一種分層設(shè)計(jì)方法,數(shù)據(jù)緩沖區(qū)(ODS)的數(shù)據(jù)結(jié)構(gòu)與源系統(tǒng)完全一致?;A(chǔ)數(shù)據(jù)模型(DWD)和融合數(shù)據(jù)模型(DWI與DWA)是大數(shù)據(jù)平臺(tái)重點(diǎn)建設(shè)的數(shù)據(jù)模型。應(yīng)用層模型由各應(yīng)用按需自行建設(shè),其中基礎(chǔ)數(shù)據(jù)模型一般采用ER模型,融合數(shù)據(jù)模型采用維度建模思路。
三、兩種經(jīng)典的數(shù)據(jù)倉(cāng)庫(kù)建模方法
前面的分層設(shè)計(jì)中你會(huì)發(fā)現(xiàn)有兩種設(shè)計(jì)方法,關(guān)系建模和維度建模,下面分別簡(jiǎn)單介紹其特點(diǎn)和適用場(chǎng)景。
當(dāng)今的數(shù)據(jù)處理方式大致可以分成兩大類:聯(lián)機(jī)事務(wù)處理OLTP(on-line transaction processing)、聯(lián)機(jī)分析處理OLAP(On-Line Analytical Processing)。OLTP是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的主要應(yīng)用,主要是基本的、日常的事務(wù)處理,例如銀行交易。OLAP是數(shù)據(jù)倉(cāng)庫(kù)系統(tǒng)的主要應(yīng)用,支持復(fù)雜的分析操作,側(cè)重決策支持,并且提供直觀易懂的查詢結(jié)果。二者的主要區(qū)別對(duì)比如下表所示
1、維度建模 (1)定義維度模型是數(shù)據(jù)倉(cāng)庫(kù)領(lǐng)域另一位大師Ralph Kimball 所倡導(dǎo)的。維度建模以分析決策的需求出發(fā)構(gòu)建模型,構(gòu)建的數(shù)據(jù)模型為分析需求服務(wù),因此它重點(diǎn)解決用戶如何更快速完成分析需求,同時(shí)還有較好的大規(guī)模復(fù)雜查詢的響應(yīng)性能,更直接面向業(yè)務(wù)。
在維度建模的基礎(chǔ)上又分為三種模型:星型模型、雪花模型、星座模型。


星座模型與前兩種情況的區(qū)別是事實(shí)表的數(shù)量,星座模型是基于多個(gè)事實(shí)表
基本上是很多數(shù)據(jù)倉(cāng)庫(kù)的常態(tài),因?yàn)楹芏鄶?shù)據(jù)倉(cāng)庫(kù)都是多個(gè)事實(shí)表的。所以星座不星座只反映是否有多個(gè)事實(shí)表,他們之間是否共享一些維度表。所以星座模型并不和前兩個(gè)模型沖突
星型模型由一個(gè)事實(shí)表和一組維表組成。每個(gè)維表都有一個(gè)維作為主鍵,所有這些維的主鍵組合成事實(shí)表的主鍵。強(qiáng)調(diào)的是對(duì)維度進(jìn)行預(yù)處理,將多個(gè)維度集合到一個(gè)事實(shí)表,形成一個(gè)寬表。
首先就是星座不星座這個(gè)只跟數(shù)據(jù)和需求有關(guān)系,跟設(shè)計(jì)沒關(guān)系,不用選擇。
星型還是雪花,取決于性能優(yōu)先,還是靈活更優(yōu)先目前實(shí)際企業(yè)開發(fā)中,不會(huì)絕對(duì)選擇一種,根據(jù)情況靈活組合,甚至并存 (一層維度和多層維度都保存) 。但是整體來看,更傾向于維度更少的星型模型。尤其是Hadoop體系,減少Join就是減少Shuffle,性能差距很大(關(guān)系型數(shù)據(jù)可以依靠強(qiáng)大的主鍵索引)
選擇業(yè)務(wù)過程→聲明粒度→確認(rèn)維度→確認(rèn)事實(shí)
(a)選擇業(yè)務(wù)過程在業(yè)務(wù)系統(tǒng)中,挑選我們感興趣的業(yè)務(wù)線,比如下單業(yè)務(wù),支付業(yè)務(wù),退款業(yè)務(wù),物流業(yè)務(wù),一條業(yè)務(wù)線對(duì)應(yīng)一張事實(shí)表。
如果是中小公司,盡量把所有業(yè)務(wù)過程都選擇。如果是大公司(1000多張表),選擇和需求相關(guān)的業(yè)務(wù)線。 (b)聲明粒度數(shù)據(jù)粒度指數(shù)據(jù)倉(cāng)庫(kù)的數(shù)據(jù)中保存數(shù)據(jù)的細(xì)化程度或綜合程度的級(jí)別。
聲明粒度意味著精確定義事實(shí)表中的一行數(shù)據(jù)表示什么,應(yīng)該盡可能選擇最小粒度,以此來應(yīng)各種各樣的需求。
典型的粒度聲明如下:- 訂單當(dāng)中的每個(gè)商品項(xiàng)作為下單事實(shí)表中的一行,粒度為每次。
- 每周的訂單次數(shù)作為一行,粒度為每周。
- 每月的訂單次數(shù)作為一行,粒度為每月。
-
如果在DWD層粒度就是每周或者每月,那么后續(xù)就沒有辦法統(tǒng)計(jì)細(xì)粒度的指標(biāo)了。所以建議采用最小粒度。
維度的主要作用是描述業(yè)務(wù)是事實(shí),主要表示的是“誰,何處,何時(shí)”等信息。
確定維度的原則是:后續(xù)需求中是否要分析相關(guān)維度的指標(biāo)。例如,需要統(tǒng)計(jì),什么時(shí)間下的訂單多,哪個(gè)地區(qū)下的訂單多,哪個(gè)用戶下的訂單多。需要確定的維度就包括:時(shí)間維度、地區(qū)維度、用戶維度。
維度表:需要根據(jù)維度建模中的星型模型原則進(jìn)行維度退化。
(d)確定事實(shí)此處的“事實(shí)”一詞,指的是業(yè)務(wù)中的度量值(次數(shù)、個(gè)數(shù)、件數(shù)、金額,可以進(jìn)行累加),例如訂單金額、下單次數(shù)等。
在DWD層,以業(yè)務(wù)過程為建模驅(qū)動(dòng),基于每個(gè)具體業(yè)務(wù)過程的特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)層事實(shí)表。事實(shí)表可做適當(dāng)?shù)膶挶砘幚?/span> 。
以下是阿里的OneData的建模工作流
(3)優(yōu)缺點(diǎn)
優(yōu)點(diǎn):技術(shù)要求不高,快速上手,敏捷迭代,快速交付;更快速完成分析需求,較好的大規(guī)模復(fù)雜查詢的響應(yīng)性能
缺點(diǎn):維度表的冗余會(huì)較多,視野狹窄
2、關(guān)系建模
(1)定義
關(guān)系模型如圖所示,嚴(yán)格遵循第三范式(3NF),從圖中可以看出,較為松散、零碎,物理表數(shù)量多,而數(shù)據(jù)冗余程度低。由于數(shù)據(jù)分布于眾多的表中,這些數(shù)據(jù)可以更為靈活地被應(yīng)用,功能性較強(qiáng)。關(guān)系模型主要應(yīng)用與OLTP系統(tǒng)中,為了保證數(shù)據(jù)的一致性以及避免冗余,所以大部分業(yè)務(wù)系統(tǒng)的表都是遵循第三范式的。
它更多是面向數(shù)據(jù)的整合和一致性治理,正如Inmon所希望達(dá)到的“single version of the truth”。

關(guān)系建模要從整體進(jìn)行考慮,也就是說要對(duì)業(yè)務(wù)有全面的了解和把控,要對(duì)上游業(yè)務(wù)系統(tǒng)的進(jìn)行信息調(diào)研,以做到對(duì)其業(yè)務(wù)和數(shù)據(jù)的基本了解,要做到主題劃分,讓模型有清晰合理的實(shí)體關(guān)系體系,以下是方法的示意:

以下是中國(guó)移動(dòng)的概念模型的一種示例,如果沒有自頂向下的視野,基本是總結(jié)不出來的:
(3)優(yōu)缺點(diǎn)
優(yōu)點(diǎn):規(guī)范性較好,冗余小,數(shù)據(jù)集成和數(shù)據(jù)一致性方面得到重視,比如運(yùn)營(yíng)商可以參考國(guó)際電信運(yùn)營(yíng)業(yè)務(wù)流程規(guī)范(ETOM),有所謂的最佳實(shí)踐。
缺點(diǎn):需要全面了解企業(yè)業(yè)務(wù)、數(shù)據(jù)和關(guān)系;實(shí)施周期非常長(zhǎng),成本昂貴;對(duì)建模人員的能力要求也非常高,容易爛尾?,F(xiàn)在一般企業(yè)中大部分都是使用維度建模來進(jìn)行數(shù)倉(cāng)模型的設(shè)計(jì)。
3、建模方法比較
一般來講,維度模型簡(jiǎn)單直觀,適合業(yè)務(wù)模式快速變化的行業(yè),關(guān)系模型實(shí)現(xiàn)復(fù)雜,適合業(yè)務(wù)模式比較成熟的行業(yè),在現(xiàn)在業(yè)務(wù)快速的發(fā)展變化,關(guān)系建模來不及快速的響應(yīng)和改變。
運(yùn)營(yíng)商以前都是關(guān)系建模,現(xiàn)在其實(shí)邊界越來越模糊,很多大數(shù)據(jù)業(yè)務(wù)變化很快,采用維度建模也比較方便,不需要頂層設(shè)計(jì)。
四、企業(yè)建模的三點(diǎn)經(jīng)驗(yàn)
維度建模就不說了,只要能理解業(yè)務(wù)過程和其中涉及的相關(guān)數(shù)據(jù)、維度就可以,但自頂向下的關(guān)系建模難度很大,以下是關(guān)系建模的三個(gè)建設(shè)要點(diǎn)。
1、業(yè)務(wù)的理解:找到企業(yè)內(nèi)最理解業(yè)務(wù)和源系統(tǒng)的人,梳理出現(xiàn)狀,比如運(yùn)營(yíng)商就要深刻理解三域(O/B/M),概念建模的挑戰(zhàn)就很大,現(xiàn)在做到B域的概念建模已經(jīng)很不容易。
2、數(shù)據(jù)及關(guān)系的理解:各個(gè)域的系統(tǒng)建設(shè)的時(shí)候沒有統(tǒng)一文檔和規(guī)范,要梳理出邏輯模型不容易,比如運(yùn)營(yíng)商的事件主題下的邏輯模型就非常復(fù)雜。
3、標(biāo)準(zhǔn)化的推進(jìn):數(shù)據(jù)倉(cāng)庫(kù)建模的任何實(shí)體都需要標(biāo)準(zhǔn)化命名,否則未來的管理成本巨大,也是后續(xù)數(shù)據(jù)有效治理的基礎(chǔ),以下是我們的一個(gè)命名規(guī)范示例:
????總而言之,你可以把這篇文章當(dāng)成一個(gè)指引,具體還是要結(jié)合企業(yè)的實(shí)際去推進(jìn),始終要明白的一個(gè)原則就是:即數(shù)據(jù)如何擺布才能提高支撐應(yīng)用的效率,手段上不用區(qū)分什么先進(jìn)不先進(jìn),好用就成。
