關(guān)于構(gòu)建數(shù)據(jù)倉(cāng)庫(kù)的幾個(gè)問題
本文轉(zhuǎn)載自微信公眾號(hào)「大數(shù)據(jù)技術(shù)與數(shù)倉(cāng)」,作者西貝。轉(zhuǎn)載本文請(qǐng)聯(lián)系大數(shù)據(jù)技術(shù)與數(shù)倉(cāng)公眾號(hào)。
寫在前面
數(shù)據(jù)倉(cāng)庫(kù)(Data Warehouse)是一個(gè)面向主題的(Subject Oriented)、集成的(Integrated)、相對(duì)穩(wěn)定的(Non-Volatile)、反映歷史變化(Time Variant)的數(shù)據(jù)集合,用于支持管理決策(Decision Making Support)。近年來,隨著大數(shù)據(jù)的應(yīng)用不斷深入,構(gòu)建企業(yè)級(jí)數(shù)據(jù)倉(cāng)庫(kù)成為了企業(yè)進(jìn)行精細(xì)化運(yùn)營(yíng)的一種趨勢(shì)。
從管理者的視角來看,數(shù)據(jù)倉(cāng)庫(kù)是賦能業(yè)務(wù)并輔助決策的一種工具,從開發(fā)者的視角來看,數(shù)據(jù)倉(cāng)庫(kù)是一堆數(shù)據(jù)模型的集合。數(shù)倉(cāng)開發(fā)是一個(gè)系統(tǒng)工程,涉及數(shù)據(jù)集成、數(shù)據(jù)建模、數(shù)據(jù)開發(fā)、數(shù)據(jù)服務(wù)、任務(wù)調(diào)度、元數(shù)據(jù)管理、數(shù)據(jù)質(zhì)量管理(DQC)等一系列的流程。另外,由于數(shù)據(jù)跟業(yè)務(wù)是息息相關(guān)的,所以在構(gòu)建數(shù)倉(cāng)的時(shí)候,需要對(duì)業(yè)務(wù)有一個(gè)非常深刻的理解。
值得注意的是,數(shù)倉(cāng)的建設(shè)不是一蹴而就的,也沒有畢其功于一役的方法,業(yè)務(wù)的不斷變化決定了數(shù)倉(cāng)是在不斷迭代中進(jìn)行完善的。從這個(gè)層面上來講,或許永遠(yuǎn)沒有完美的數(shù)倉(cāng)。由于人員的流動(dòng)、業(yè)務(wù)的變化以及前期的系統(tǒng)性建設(shè)不足,數(shù)倉(cāng)總會(huì)存在這樣或那樣的問題。
或許我們可以用"是否成熟"描述數(shù)倉(cāng)的建設(shè),那么什么是成熟的數(shù)倉(cāng)呢,我們不妨換個(gè)角度思考一下:什么是一個(gè)不成熟的數(shù)據(jù)倉(cāng)庫(kù)?此時(shí)你的腦海里是否會(huì)蹦出一個(gè)詞,那就是混亂。是的,一個(gè)不成熟的數(shù)倉(cāng)雖然具備了部分?jǐn)?shù)倉(cāng)規(guī)范,但在具體的落地實(shí)施過程中,并未能完全按照規(guī)范操作, 導(dǎo)致數(shù)據(jù)倉(cāng)庫(kù)建設(shè)比較混亂,比如數(shù)據(jù)域劃分不清楚、數(shù)倉(cāng)分層不明確、數(shù)據(jù)任務(wù)隨意依賴、數(shù)據(jù)重復(fù)開發(fā)等等問題。迫于業(yè)務(wù)快速變化以及日常數(shù)據(jù)開發(fā)需求的壓力,造成了數(shù)據(jù)開發(fā)沒有太多的時(shí)間和精力去顧及這些問題,最終形成了一個(gè)不成熟的數(shù)倉(cāng)。一旦出現(xiàn)了這些問題,后續(xù)就需要有專門的數(shù)據(jù)治理團(tuán)隊(duì)去規(guī)劃并規(guī)范數(shù)倉(cāng)的建設(shè)。
所以,假設(shè)你接手了一個(gè)不成熟的數(shù)倉(cāng)項(xiàng)目,或者你覺得目前的數(shù)倉(cāng)建設(shè)還不夠成熟,那么不妨思考一下幾個(gè)問題:
- 定目標(biāo)
- 選技術(shù)
- 找問題
- 劃主題
- 識(shí)分層
- 理建模
- 制規(guī)范
定目標(biāo)數(shù)倉(cāng)設(shè)計(jì)目標(biāo)包括數(shù)倉(cāng)分層清晰,字段與模型命名規(guī)范,具備較高可復(fù)用性與可維護(hù)性,能夠快速響應(yīng)產(chǎn)品運(yùn)營(yíng)層面的數(shù)據(jù)分析需求,以數(shù)據(jù)驅(qū)動(dòng)產(chǎn)品迭代與業(yè)務(wù)增長(zhǎng)。
數(shù)倉(cāng)設(shè)計(jì)的過程中,堅(jiān)持用戶驅(qū)動(dòng)與數(shù)據(jù)驅(qū)動(dòng)相結(jié)合的設(shè)計(jì)理念,即一方面根據(jù)當(dāng)前的業(yè)務(wù)數(shù)據(jù)的基礎(chǔ)和質(zhì)量情況,以數(shù)據(jù)源分析為出發(fā)點(diǎn)構(gòu)建數(shù)據(jù)倉(cāng)庫(kù);另一方面根據(jù)業(yè)務(wù)的方向性需求,從業(yè)務(wù)需要解決的具體問題出發(fā),確定系統(tǒng)范圍和需求框架。
選技術(shù)
數(shù)據(jù)倉(cāng)庫(kù)是一個(gè)復(fù)雜系統(tǒng),會(huì)涉及到一系列的流程,由此不可避免的會(huì)使用很多的技術(shù)框架。目前,行業(yè)中使用的常見工具主要包括:數(shù)據(jù)同步工具、數(shù)據(jù)處理工具、任務(wù)調(diào)度工具、報(bào)表工具、元數(shù)據(jù)管理工具、質(zhì)量管理平臺(tái)(DQC)以及大數(shù)據(jù)基礎(chǔ)平臺(tái)等等。
如果是自建的大數(shù)據(jù)平臺(tái),或者是沒有一個(gè)大數(shù)據(jù)開發(fā)平臺(tái),這種情況下需要數(shù)倉(cāng)開發(fā)人員具備豐富的技術(shù)棧,既要兼顧技術(shù)的集成使用,又要兼顧數(shù)倉(cāng)的建設(shè)與業(yè)務(wù)需求的開發(fā)。如果使用的是已經(jīng)集成好的開發(fā)套件,比如阿里云的dataworks,這樣數(shù)倉(cāng)的開發(fā)人員會(huì)更加聚焦數(shù)倉(cāng)的建設(shè),而不是在各種技術(shù)的集成過程中踩坑而分散過多的精力。
找問題
前文已經(jīng)提到?jīng)]有完美的數(shù)倉(cāng),其實(shí)數(shù)倉(cāng)的建設(shè)并沒有對(duì)與錯(cuò)之分,只有好與壞之差。我們不能一味的使用拿來主義的方式去構(gòu)建數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)倉(cāng)庫(kù)建設(shè)能否成功會(huì)涉及很多的因素,數(shù)倉(cāng)建設(shè)的方法論是指引我們的一個(gè)方向,萬(wàn)萬(wàn)不可迷失其中。一言以蔽之,合適就好。
在接手不成熟的數(shù)倉(cāng)時(shí),需要梳理存在的一些問題,而這些問題一般情況下都大同小異,常見的一些問題主要包括:
- 數(shù)倉(cāng)分層不清晰
- 數(shù)據(jù)域劃分不明確
- 模型設(shè)計(jì)不合理
- 代碼不規(guī)范
- 命名不統(tǒng)一
劃主題
主題域是業(yè)務(wù)過程的抽象集合,是在較高層次上對(duì)數(shù)據(jù)進(jìn)行分類聚集的抽象,這是一個(gè)邏輯概念,主要方便數(shù)據(jù)的分類管理。業(yè)務(wù)過程就是企業(yè)經(jīng)營(yíng)過程中一個(gè)個(gè)不可拆分的行為事件,比如倉(cāng)儲(chǔ)管理里面有入庫(kù)、出庫(kù)、發(fā)貨、簽收,都是業(yè)務(wù)過程,抽象出來的主題域就是倉(cāng)儲(chǔ)域。主題域劃分要盡量涵蓋所有業(yè)務(wù)需求,保持相對(duì)穩(wěn)定性,還具備一定的擴(kuò)展性,新加入一個(gè)主題域,不影響已經(jīng)劃分的主題域的表。有了主題域之后,每個(gè)數(shù)據(jù)模型也就有了一個(gè)歸屬,這樣數(shù)據(jù)組織會(huì)更加的清晰,同時(shí)也比較方便維護(hù)。
識(shí)分層
數(shù)倉(cāng)為什么要分層
合理的數(shù)據(jù)倉(cāng)庫(kù)分層一方面能夠降低耦合性,提高重用性,可讀性可維護(hù)性,另一方面也能提高運(yùn)算的效率,影響到數(shù)據(jù)需求迭代的速度,近而影響到產(chǎn)品決策的及時(shí)性。建立數(shù)據(jù)分層可以提煉公共層,避免煙囪式開發(fā),可見一個(gè)合適且合理的數(shù)倉(cāng)分層是極其重要。
通用分層設(shè)計(jì)思路
- ODS:操作型數(shù)據(jù)(Operational Data Store),指結(jié)構(gòu)與源系統(tǒng)基本保持一致的增量或者全量數(shù)據(jù)。作為DW數(shù)據(jù)的一個(gè)數(shù)據(jù)準(zhǔn)備區(qū),同時(shí)又承擔(dān)基礎(chǔ)數(shù)據(jù)記錄歷史變化,之所以保留原始數(shù)據(jù)和線上原始數(shù)據(jù)保持一致,方便后期數(shù)據(jù)核對(duì)需要。
- CDM:通用數(shù)據(jù)模型,又稱為數(shù)據(jù)中間層(Common Data Model),包含DWD、DWS、DIM層。
- DWD:數(shù)據(jù)倉(cāng)庫(kù)明細(xì)層數(shù)據(jù)(Data Warehouse Detail)。對(duì)ODS層數(shù)據(jù)進(jìn)行清洗轉(zhuǎn)化,以業(yè)務(wù)過程作為建模驅(qū)動(dòng),基于每個(gè)具體的業(yè)務(wù)過程特點(diǎn),構(gòu)建最細(xì)粒度的明細(xì)事實(shí)表??梢越Y(jié)合企業(yè)的數(shù)據(jù)使用特點(diǎn),基于維度建模思想,將明細(xì)事實(shí)表的某些重要屬性字段做適當(dāng)冗余,也即寬表化處理,構(gòu)建明細(xì)寬表。
- DWS:數(shù)據(jù)倉(cāng)庫(kù)匯總層數(shù)據(jù)(Data Warehouse Summary),基于指標(biāo)需求,構(gòu)建初步匯總事實(shí)表,一般是寬表?;谏蠈拥膽?yīng)用和產(chǎn)品的指標(biāo)需求,構(gòu)建公共粒度的匯總指標(biāo)表。以寬表化手段物理化模型,構(gòu)建命名規(guī)范、口徑一致的統(tǒng)計(jì)指標(biāo),為上層提供公共指標(biāo)。
- DIM:建立一致數(shù)據(jù)分析維表,可以降低數(shù)據(jù)計(jì)算口徑不統(tǒng)一的風(fēng)險(xiǎn),同時(shí)可以方便進(jìn)行交叉探查。以維度作為建模驅(qū)動(dòng),基于每個(gè)維度的業(yè)務(wù)含義,通過添加維度屬性、關(guān)聯(lián)維度等定義計(jì)算邏輯,完成屬性定義的過程并建立一致的數(shù)據(jù)分析維表。
- ADS:面向應(yīng)用的數(shù)據(jù)服務(wù)層(Application Data Service)。整合匯總成分析某一個(gè)主題域的服務(wù)數(shù)據(jù),面向應(yīng)用邏輯的數(shù)據(jù)加工。該層主要存放數(shù)據(jù)產(chǎn)品個(gè)性化的統(tǒng)計(jì)指標(biāo)數(shù)據(jù),這一層的數(shù)據(jù)直接對(duì)接數(shù)據(jù)的消費(fèi)者,是產(chǎn)品、運(yùn)營(yíng)等角色可以直接感知理解的一層,大多數(shù)這一層的表都可以直接在BI上通過圖表的形式直接透出。
分層辨析
ODS層
ODS層的概念主要體現(xiàn)在兩個(gè)方面:
- 操作型系統(tǒng)的集成,用于當(dāng)前、歷史以及其它細(xì)節(jié)查詢(業(yè)務(wù)系統(tǒng)的一部分)
- 為決策支持提供當(dāng)前細(xì)節(jié)數(shù)據(jù)(數(shù)據(jù)倉(cāng)庫(kù)的一部分)
ODS是用于支持企業(yè)日常的全局應(yīng)用的數(shù)據(jù)集合,ODS的數(shù)據(jù)具有面向主題、集成的、可變的以及數(shù)據(jù)是當(dāng)前的或是接近當(dāng)前的特點(diǎn)。同樣也可以看出ODS是介于DB和DW之間的一種過渡存儲(chǔ)。
值得注意的是,Kimball所說的ODS是物理落地關(guān)系型數(shù)據(jù)庫(kù)中,但是在實(shí)際生產(chǎn)應(yīng)用中,ODS往往是物理落地在數(shù)據(jù)倉(cāng)庫(kù)中,比如Hive。
通常來說ODS是在數(shù)據(jù)倉(cāng)庫(kù)中存儲(chǔ)業(yè)務(wù)系統(tǒng)源數(shù)據(jù),所以從數(shù)據(jù)粒度、數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)關(guān)系等各個(gè)方面都與業(yè)務(wù)系統(tǒng)的數(shù)據(jù)源保持一致。但是,也不能僅僅將ODS層看做是業(yè)務(wù)系統(tǒng)數(shù)據(jù)源的一個(gè)簡(jiǎn)單備份,ODS和業(yè)務(wù)系統(tǒng)數(shù)據(jù)源的差異主要是由于兩者之間面向業(yè)務(wù)需求是不同的,業(yè)務(wù)系統(tǒng)是面向多并發(fā)讀寫同時(shí)有需要滿足數(shù)據(jù)的一致性,而ODS數(shù)據(jù)通常是面向數(shù)據(jù)報(bào)表等批量數(shù)據(jù)查詢需求。
關(guān)于ODS層與業(yè)務(wù)系統(tǒng)DB的主要區(qū)別,體現(xiàn)在一下幾個(gè)方面:
- 數(shù)據(jù)存儲(chǔ)方式方面。由于性能壓力,業(yè)務(wù)DB需要對(duì)同一個(gè)邏輯表進(jìn)行分表分庫(kù)操作,而ODS會(huì)將業(yè)務(wù)系統(tǒng)中同一個(gè)邏輯表統(tǒng)一到一個(gè)物理實(shí)體中存儲(chǔ)
- 數(shù)據(jù)存儲(chǔ)介質(zhì)方面。業(yè)務(wù)系統(tǒng)通常用oralce、MySQL、DB2等以事務(wù)性處理見長(zhǎng)關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng),ODS通常存儲(chǔ)在以Hadoop為代表的分布式系統(tǒng)中,比如Hive等等。
- 數(shù)據(jù)組織形式方面。業(yè)務(wù)系統(tǒng)表通常需要遵循三范式,并且需要?jiǎng)?chuàng)建復(fù)雜的索引結(jié)構(gòu)來提升查詢效率,但是ODS層的表通常沒有索引。
ODS層的數(shù)據(jù)同步通常會(huì)使用數(shù)據(jù)庫(kù)直連抽取或者數(shù)據(jù)庫(kù)日志抽取的方式,在設(shè)計(jì)ODS物理表時(shí),在表命名、數(shù)據(jù)存儲(chǔ)等方面都需要遵循一定的準(zhǔn)則。比如:不管是表命名還是字段命名盡量和業(yè)務(wù)系統(tǒng)保持一致,但是需要通過額外的標(biāo)識(shí)來區(qū)分增量和全量表,”_delta”來標(biāo)識(shí)該表為增量表。另外,為了滿足歷史數(shù)據(jù)分析需求,我們需要在ODS表中加一個(gè)時(shí)間維度,這個(gè)維度通常在ODS表中作為分區(qū)字段。如果是增量存儲(chǔ),則可以按天為單位使用業(yè)務(wù)日期作為分區(qū),每個(gè)分區(qū)存放日增量的業(yè)務(wù)數(shù)據(jù)。如果是全量存儲(chǔ),只可以按天為單位使用業(yè)務(wù)日期作為分區(qū),每個(gè)分區(qū)存儲(chǔ)截止到當(dāng)前業(yè)務(wù)時(shí)間的全量快照數(shù)據(jù)。
DWD層
DWD層的數(shù)據(jù)一般存放明細(xì)事實(shí)表,為了提升訪問便利性和訪問性能,在維度模型的事實(shí)表基礎(chǔ)上,將部分常用維度冗余到事實(shí)表,從而形成寬表模型。
明細(xì)事實(shí)表的設(shè)計(jì)有五個(gè)步驟:選擇業(yè)務(wù)過程--->確定粒度--->選擇維度--->確定事實(shí)(度量)--->冗余維度。
DWS層
以分析的主題對(duì)象作為建模驅(qū)動(dòng),基于上層的應(yīng)用和產(chǎn)品的指標(biāo)需求,構(gòu)建公共粒度的匯總指標(biāo)表。以寬表化手段物理化模型,構(gòu)建命名規(guī)范、口徑一致的統(tǒng)計(jì)指標(biāo),為上層提供公共指標(biāo),建立匯總寬表。如:形成日,周,月粒度匯總明細(xì),或者基于某一個(gè)維度,如商品類目粒度的匯總?cè)毡?,統(tǒng)計(jì)便于下一步報(bào)表數(shù)據(jù)結(jié)構(gòu)的組織。
關(guān)于匯總層的表建模應(yīng)遵循以下的原則:
- 數(shù)據(jù)公用性比如,匯總的聚集表能否與他人公用?基于某個(gè)維度的聚集是否是數(shù)據(jù)分析或者報(bào)表中經(jīng)常使用的?如果滿足這些情況,我們就有必要把明細(xì)數(shù)據(jù)沉淀到匯總表中。
- 不跨數(shù)據(jù)域數(shù)據(jù)域是在較高層次上對(duì)數(shù)據(jù)進(jìn)行分類聚集的抽象,如交易統(tǒng)一劃到交易域下,商品的新增、修改放到商品域下。
- 區(qū)分統(tǒng)計(jì)周期表命名上要能說明數(shù)據(jù)的統(tǒng)計(jì)周期,如_1d 表示最近1天,_td 截止到當(dāng)天,_nd 表示最近N天。
- 避免多個(gè)層級(jí)的數(shù)據(jù)應(yīng)該避免將不同層級(jí)的數(shù)據(jù)放在一起,比如,如果存在7天和30天的事實(shí),我們可以選擇用兩列存放7天和30天的事實(shí),但是需要在列名和字段注釋上說明清楚。同時(shí)我們也可以使用兩張表分別存儲(chǔ)不同統(tǒng)計(jì)周期的數(shù)據(jù)加以區(qū)分。
聚集是不跨越事實(shí)的聚集是針對(duì)原始星型模型進(jìn)行的匯總,為了獲取和查詢?cè)寄P鸵恢碌慕Y(jié)果,聚集的維度和度量必須與原始模型保持一致,因此聚集是不跨事實(shí)的。橫向鉆取(交叉探查)是針對(duì)多個(gè)事實(shí)基于一致性維度進(jìn)行的分析,很多時(shí)候采用融合事實(shí)表,預(yù)先存放橫向鉆取的結(jié)果,從而提高查詢性能。因此融合事實(shí)表是一種導(dǎo)出模式而不是聚集。
DIM層
該層主要存儲(chǔ)一致性維度數(shù)據(jù),數(shù)據(jù)倉(cāng)庫(kù)總線架構(gòu)重要基石之一就是一致性維度。通過構(gòu)建一致性維度我們可以輕松實(shí)現(xiàn)數(shù)據(jù)的交叉探查。
維度是維度建模的基礎(chǔ)和靈魂。維度建模中,將度量稱為“事實(shí)”,將環(huán)境描述為“維度”,維度是用于分析事實(shí)所需要的多樣環(huán)境。例如,在分析交易過程時(shí),可以通過買家、賣家、商品和時(shí)間等維度描述交易發(fā)生的環(huán)境。維度所包含的表示維度的列,稱為維度屬性。維度屬性是查詢約束條件、分組和報(bào)表標(biāo)簽生成的基本來源,是數(shù)據(jù)易用性的關(guān)鍵。
ADS層
個(gè)性化指標(biāo)加工,主要存儲(chǔ)不具有公用性的復(fù)雜指標(biāo),比如針對(duì)某張數(shù)據(jù)報(bào)表設(shè)計(jì)的底層數(shù)據(jù)存儲(chǔ)模型。
分層注意點(diǎn)
- ODS不可以被應(yīng)用層調(diào)用
- CDM層任務(wù)的深度不宜過大
- DWS優(yōu)先調(diào)用DWD及DIM
- 避免ADS過渡引用明細(xì)層
理建模前文介紹了數(shù)據(jù)分層的概念,而數(shù)據(jù)建模更多的著眼于數(shù)據(jù)公共層處理。
好的數(shù)據(jù)建模有哪些特點(diǎn)
數(shù)據(jù)模型就是數(shù)據(jù)組織和存儲(chǔ)方法,強(qiáng)調(diào)從業(yè)務(wù)、數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)使用角度合理存儲(chǔ)數(shù)據(jù)。好的數(shù)據(jù)建模一般具備如下特點(diǎn):
- 性能:能夠幫助使用者快速查詢所需要的數(shù)據(jù),減少數(shù)據(jù)的I/O吞吐,提高使用數(shù)據(jù)的效率。
- 成本:減少不必要的數(shù)據(jù)冗余與重復(fù)計(jì)算,實(shí)現(xiàn)計(jì)算結(jié)果的良好復(fù)用,從而降低存儲(chǔ)和計(jì)算成本。
- 質(zhì)量:減少數(shù)據(jù)統(tǒng)計(jì)口徑不一致性,減少數(shù)據(jù)計(jì)算錯(cuò)誤的可能性。
數(shù)據(jù)模型設(shè)計(jì)原則
- 高內(nèi)聚和低耦合 一個(gè)邏輯和物理模型由哪些記錄和字段組成,應(yīng)該遵循最基本的軟件設(shè)計(jì)方法論的高內(nèi)聚和低耦合原則。主要從數(shù)據(jù)業(yè)務(wù)特性和訪問特性兩個(gè)角度來考慮:將業(yè)務(wù)相近或者相關(guān)的數(shù)據(jù)、粒度相同數(shù)據(jù)設(shè)計(jì)為一個(gè)邏輯或者物理模型;將高概率同時(shí)訪問的數(shù)據(jù)放一起,將低概率同時(shí)訪問的數(shù)據(jù)分開存儲(chǔ)。
- 核心模型與擴(kuò)展模型分離 建立核心模型與擴(kuò)展模型體系,核心模型包括的字段支持常用核心的業(yè)務(wù),擴(kuò)展模型包括的字段支持個(gè)性化或是少量應(yīng)用的需要,不能讓擴(kuò)展字段過度侵入核心模型,破壞了核心模型的架構(gòu)簡(jiǎn)潔性與可維護(hù)性。
- 公共處理邏輯下沉及單一 越是底層公用的處理邏輯更應(yīng)該在數(shù)據(jù)調(diào)度依賴的底層進(jìn)行封裝與實(shí)現(xiàn),不要讓公共的處理邏輯暴露給應(yīng)用層實(shí)現(xiàn),不要讓公共邏輯在多處同時(shí)存在。
- 成本與性能平衡 適當(dāng)?shù)臄?shù)據(jù)冗余換取查詢和刷新性能,不宜過度冗余與數(shù)據(jù)復(fù)制。
- 數(shù)據(jù)可回滾 處理邏輯不變,在不同時(shí)間多次運(yùn)行數(shù)據(jù)結(jié)果確定不變。
- 一致性 相同的字段含義在不同表中字段命名必須相同,必須使用規(guī)范定義中的名稱。
- 命名清晰可理解 表命名需清晰、一致,表名需易于消費(fèi)者理解和使用。
典型的數(shù)據(jù)倉(cāng)庫(kù)建模方法
數(shù)倉(cāng)建模的典型方法有:實(shí)體建模(ER模型)、維度建模法、Data Vault 模型、Anchor 模型。目前使用較多的當(dāng)屬維度建模,而維度建模中,又分為星型模型和雪花模型兩大類,一般星型模型使用較多。
- 星型模型:維度建模非常直觀,緊緊圍繞著業(yè)務(wù)模型,可以直觀的反映出業(yè)務(wù)模型中的業(yè)務(wù)問題。不需要經(jīng)過復(fù)雜的表關(guān)聯(lián),就能夠拿到業(yè)務(wù)分析想要的全部數(shù)據(jù),能夠極大的提升數(shù)據(jù)倉(cāng)庫(kù)的處理能力,缺點(diǎn)則是數(shù)據(jù)冗余較多。
- 雪花模型:在星型的基礎(chǔ)上,分解維度,雪花模型的維度表可以擁有其他維度表的,雖然這種模型相比星型模型更規(guī)范一些,但是由于這種模型不太容易理解,維護(hù)成本比較高,而且性能方面需要關(guān)聯(lián)多層維表,性能也比星型模型要低,普遍用的少一些。
關(guān)于維度建模,主要是將數(shù)據(jù)分為了維表和事實(shí)表。維度建模中,將度量稱為“事實(shí)”,將環(huán)境描述為“維度”,維度是用于分析事實(shí)所需要的多樣環(huán)境。例如,在分析交易過程時(shí),可以通過買家、賣家、商品和時(shí)間等維度描述交易發(fā)生的環(huán)境。維度所包含的表示維度的列,稱為維度屬性。維度屬性是查詢約束條件、分組和報(bào)表標(biāo)簽生成的基本來源,是數(shù)據(jù)易用性的關(guān)鍵。
事實(shí)表
事實(shí)表作為數(shù)據(jù)倉(cāng)庫(kù)維度建模的核心,緊緊圍繞著業(yè)務(wù)過程來設(shè)計(jì),通過獲取描述業(yè)務(wù)過程的度量來表達(dá)業(yè)務(wù)過程,包含了引用的維度和與業(yè)務(wù)過程有關(guān)的度量。事實(shí)表中一條記錄所表達(dá)的業(yè)務(wù)細(xì)節(jié)程度被稱為粒度。粒度通??梢酝ㄟ^兩種方式來表述:一種是維度屬性組合所表示的細(xì)節(jié)程度,一種是所表示的具體業(yè)務(wù)含義。
相對(duì)維度表來說,通常事實(shí)表要細(xì)長(zhǎng)的多,行的增加速度也比維度表快很多。維度屬性也可以存儲(chǔ)到事實(shí)表中,這種存儲(chǔ)到事實(shí)表中的維度列被稱為退化維度。與其他存儲(chǔ)在維度表中的維度一樣,退化維度也可以用來作為事實(shí)表的過濾查詢、實(shí)現(xiàn)聚合操作等。
事實(shí)表有三種類型:事務(wù)事實(shí)表、周期快照事實(shí)表、累積快照事實(shí)表。
維表
注意問題
- 盡可能包含豐富的維度屬性 豐富的維度屬性可以為數(shù)據(jù)分析統(tǒng)計(jì)提供更多的分析角度
- 編碼與文字描述共存 盡可能多給出包括一些富有意義的文字性描述,除此之外,為了保持?jǐn)U展性,需要將編碼code與文字描述同時(shí)保留,方便以后新增加屬性時(shí)導(dǎo)致錯(cuò)誤的計(jì)算。比如商品維度中的商品ID和商品標(biāo)題,類目ID和類目名稱等。ID一般用于不同表之前的關(guān)聯(lián),而名稱一般用于報(bào)表標(biāo)簽。
- 區(qū)分?jǐn)?shù)值型的維度屬性 數(shù)值型字段是作為事實(shí)還是維度屬性,取決于該字段的作用。如果通常是用于查詢約束條件或分組統(tǒng)計(jì),則是作為維度屬性;如果通常是用于參與度量的計(jì)算,則是作為事實(shí)。比如商品價(jià)格,可以用于查詢約束條件或統(tǒng)計(jì)價(jià)格區(qū)間的商品數(shù)量,此時(shí)是作為維度屬性使用;也可以用于統(tǒng)計(jì)某類目下商品的平均價(jià)格,此時(shí)是作為事實(shí)使用。
- 盡量沉淀出通用的維度屬性 有些維度屬性獲取需要進(jìn)行比較復(fù)雜的邏輯處理,有需要通過多表關(guān)聯(lián)得到,也有單表的不同字段混合處理得到,或者對(duì)單表的某個(gè)字段進(jìn)行解析得到。此時(shí),需要將盡可能多的通用的維度屬性進(jìn)行沉淀。一方面,可以提高下游使用的方便性,減少?gòu)?fù)雜度;另一方面,避免下游使用解析時(shí)由于各自邏輯不同而導(dǎo)致的口徑不一致。比如有些字段存儲(chǔ)在JSON字符串中,則需要解析出來。再比如有時(shí)候無(wú)法直接獲取某個(gè)維度屬性,這個(gè)時(shí)候就需要進(jìn)行加工判斷,將其作為一個(gè)單獨(dú)的屬性字段。
維度表一般是很不規(guī)范化的。實(shí)際應(yīng)用中,幾乎總是使用維度表的空間來?yè)Q取簡(jiǎn)明性和查詢性能。
緩慢變化維
數(shù)據(jù)倉(cāng)庫(kù)的重要特點(diǎn)之一是反應(yīng)歷史變化,所以如何處理維度的變化是維度設(shè)計(jì)的重要工作之一。緩慢變化維的提出是因?yàn)樵诂F(xiàn)實(shí)世界中,維度的屬性并不是靜態(tài)的,它會(huì)隨著時(shí)間的變化而發(fā)生緩慢的變化,這一現(xiàn)象稱為緩慢變化的維度,簡(jiǎn)稱緩慢變化維。與數(shù)據(jù)增長(zhǎng)較為快速的事實(shí)表相比,維度變化相對(duì)緩慢。
在Kimball的理論中,有三種緩慢變化的處理方式,分別是:
- type1:重寫維度值。采用此種方式,不保留歷史,始終取最新數(shù)據(jù)。
- type2:插入新的維度行。采用此種方式,保留歷史,維度值變化前的事實(shí)和過去的維度值關(guān)聯(lián),維度值變化后的事實(shí)和當(dāng)前的維度值關(guān)聯(lián)。
- type3:添加維度列
在Kimball的理論中,必須使用代理鍵作為每個(gè)維度表的主鍵,用于處理緩慢變化維度,這種方式在實(shí)際的操作中非常復(fù)雜,使用起來也不方便,所以一般情況下不使用代理鍵。
常用緩慢變化維的處理方式
常見的方式是使用快照來處理緩慢變化維。離線數(shù)倉(cāng)按T+1計(jì)算,處理維度變化的方式就是每天一份全量快照。比如商品維度,每天保留一份全量商品快照數(shù)據(jù)。任意一天的事實(shí)均可以取到當(dāng)天的商品信息,也可以取到最新的商品信息,通過限定日期,采用自然鍵進(jìn)行關(guān)聯(lián)即可。
此方式的優(yōu)勢(shì)是簡(jiǎn)單而有效,開發(fā)和維護(hù)成本低,另外使用方便,理解性好。數(shù)據(jù)使用方只需要限定日期即可取到當(dāng)天的快照數(shù)據(jù)。任意一天的事實(shí)快照和任意一天的維度快照通過維度的自然鍵進(jìn)行關(guān)聯(lián)即可。主要的缺點(diǎn)就是會(huì)造成存儲(chǔ)資源的浪費(fèi),由于存儲(chǔ)成本遠(yuǎn)低于CPU、內(nèi)存等成本,此方法總體來說弊大于利。
制規(guī)范
達(dá)成共識(shí)
對(duì)于數(shù)倉(cāng)開發(fā)規(guī)范,務(wù)必要執(zhí)行到位,確保大家能夠達(dá)成一致的理解與認(rèn)可。只有按照規(guī)范操作,才不至于使數(shù)倉(cāng)最終變得越來越臃腫,越來越低效。關(guān)于規(guī)范的制定,需要經(jīng)過團(tuán)隊(duì)人員的一致認(rèn)可,具有可操作性,切不可畏手畏腳地被規(guī)范束縛,影響開發(fā)效率。
表命名規(guī)范
- ODS層表命名規(guī)范 比如全量表:ods.s{源系統(tǒng)表名} 比如增量表:ods.s{源系統(tǒng)表名}_delta
- DIM/DWD層表命名規(guī)范 比如全量表:dwd_{數(shù)據(jù)域縮寫}{自定義表命名}df 比如增量表:dwd{數(shù)據(jù)域縮寫}{自定義表命名}_di 比如維表:dim[{業(yè)務(wù)域縮寫}]{自定義表命名}
- DWS層表命名規(guī)范 dws_{數(shù)據(jù)域縮寫}{維度縮寫}{自定義表命名}{數(shù)字}_{d/m/y,分別表示天、月、年}
最近一天 1d 最近N天 (N)d ---N代表是一個(gè)數(shù)字 最近30天 1m 最近7天 1w 最近365天 1y 周累計(jì)至今 wtd ----周報(bào)周(周六至周五) 月初累計(jì)至今 mtd 累計(jì)至今 td
- ADS層表命名 比如:ads_{數(shù)據(jù)域}{統(tǒng)計(jì)粒度}[{業(yè)務(wù)限定}][{自定義命名標(biāo)簽}]{統(tǒng)計(jì)周期}
關(guān)于表的命名需要根據(jù)具體團(tuán)隊(duì)的約定,一般見名知意即可,一旦規(guī)定了具體的格式,就盡量統(tǒng)一風(fēng)格
開發(fā)規(guī)范
- 編碼規(guī)范
- SQL注釋
總結(jié)
本文主要介紹了構(gòu)建數(shù)倉(cāng)的過程中或者在接手一個(gè)不成熟的數(shù)倉(cāng)之后需要注意的一些問題,主要包括7個(gè)方面,分別是定目標(biāo)、選技術(shù)、找問題、劃主題、識(shí)分層、理建模、制規(guī)范。這些方面只是數(shù)倉(cāng)構(gòu)建中的一部分,由于篇幅限制,不能一一詳述,希望本文對(duì)你有所幫助。