數倉如何建模?四種方法與實例都在這了
一眾問題搞得小伙伴們死去活來,甚至工作好幾年的小伙伴都沒搞清楚過,尤其是大廠特別愛問這些問題。有些小伙伴甚至覺得這些都是形而上學,不懂這些我不一樣搞了很多年開發?即使感興趣的買了一本厚厚的數據倉庫工具書也看不懂!那么實際數據倉庫建模到底是什么,開發人員該掌握哪些?
1.什么是數據倉庫及其前世今生
來一起看個官方定義:數據倉庫,英文名稱為DataWarehouse,可簡寫為DW或DWH。數據倉庫,是為企業所有級別的決策制定過程,提供所有類型數據支持的戰略集合。它出于分析性報告和決策支持目的而創建。為需要業務智能的企業,提供指導業務流程改進、監視時間、成本、質量以及控制。
數據倉庫之父 Bill Inmon 在 1991 年出版的 Building the Data Warehouse 一書中首次提出了被廣為認可的數據倉庫定義。Inmon 將數據倉庫描述為一個面向主題的、集成的、隨時間變化的、非易失的數據集合,用于支持管理者的決策過程。
簡單點來說,現實情況是一個企業有很多數據源,比如有的業務數據存放在Mysql,PG庫,有的存放在Oracle,有的日志存放在Ftp,Nginx服務器上等,有的是外部采集的爬蟲數據等等。
那么對于企業來說沉淀了這么多數據,如何將這些數據放到一起進行數據融合,數據分析,給企業挖掘數據價值呢?這些不同數據源,不同數據存儲格式,不同的數據更新周期,如果讓你把企業這些數據融合分析,你怎么辦?
首先,你是不是要把這些不同數據按照統一的格式,一定的規范存儲到一起,然后在通過特定的工具做數據計算分析?那么對于企業來說,把企業各種數據源的數據放到一起存儲和計算的地方就叫數據倉庫(約定俗稱的叫法),所以本質上數據倉庫上融合各個數據源,存儲加工數據的地方,早期大數據沒有發展起來的時候,企業數據倉庫的載體一般是Oracle,那時候主要給企業做BI報表(Business Intelligence商業智能)。
后來隨著企業數字化,互聯網的發展,企業收集到數據越來越多,發現原有的技術框架已經滿足不了業務存儲和分析的需求了。于是乎就有了現在Hadoop生態為主的數倉倉庫。
2.數據倉庫建模的目的
為什么要進行數據倉庫建模?大數據的數倉建模是通過建模的方法更好的組織、存儲數據,以便在 性能、成本、效率和數據質量之間找到最佳平衡點。一般主要從下面四點考慮:
- 訪問性能:能夠快速查詢所需的數據,減少數據I/O。
- 數據成本:減少不必要的數據冗余,實現計算結果數據復用,降低大數 據系統中的存儲成本和計算成本。
- 使用效率:改善用戶應用體驗,提高使用數據的效率。
- 數據質量:改善數據統計口徑的不一致性,減少數據計算錯誤 的可能性,提供高質量的、一致的數據訪問平臺。
3.常見的建模方法
數據倉庫本質是從數據庫衍生出來的,所以數據倉庫的建模也是不斷衍生發展的。從最早的借鑒數據庫的范式建模,到逐漸提出維度建模,Data Vault模型,Anchor模型等等,越往后建模的要求越高,越需滿足3NF,4NF等。但是對于數據倉庫來說,目前主流還是維度建模,會夾雜著范式建模。
數據倉庫建模方法論可分為:范式建模、維度建模、Data Vault模型、Anchor模型。
范式建模(E-R模型)
將事物抽象為“實體”、“屬性”、“關系”來表示數 據關聯和事物描述;實體:Entity,關系:Relationship,這種對數據的抽象 建模通常被稱為ER實體關系模型 。
ER模型是數據庫設計的理論基礎,當前幾乎所有的OLTP系統設計都采用ER模型建模的方式,且該建模方法需要滿足3NF。Bill Inom提出的數倉理論,推薦采用ER關系模型進行建模,BI架構提出分層架構,數倉底層ods、dwd也多采用ER關系模型就行設計。
但是逐漸隨著企業數據的高增長,復雜化,數倉全部使用ER模型建模顯得越來越不合時宜。為什么呢,因為其按部就班的步驟,三范式等,不適合現代化復雜,多變的業務組織。
E-R模型建模的步驟(滿足3NF)如下:
- 抽象出主體 (教師,課程)。
- 梳理主體之間的關系(一個老師可以教多門課,一門課可以被多個老師教)。
- 梳理主體的屬性(教師:教師名稱,性別,學歷等)。
- 畫出E-R關系圖。
- 維度建模
維度建模,是數據倉庫大師Ralph Kimball提出的,是數據倉庫工程領域最流行的數倉建模經典。
維度建模以分析決策的需求出發構建模型,構建的數據模型為分析需求服務,因此它重點解決用戶如何更快速完成分析需求,同時還有較好的大規模復雜查詢的響應性能。維度建模是面向分析的,為了提高查詢性能可以增加數據冗余,反規范化的設計技術。
Ralph Kimball提出對數據倉庫維度建模,并且將數據倉庫中的表劃分為事實表、維度表兩種類型。
1)事實表
在ER模型中抽象出了有實體、關系、屬性三種類別,在現實世界中,每一個操作型事件,基本都是發生在實體之間的,伴隨著這種操作事件的發生,會產生可度量的值,而這個過程就產生了一個事實表,存儲了每一個可度量的事件。以電商行業為例:電商場景:一次購買事件,涉及主體包括客戶、商品、商家,產生的可度量值 包括商品數量、金額、件數等:
- 事實表根據粒度的角色劃分不同,可分為事務事實表、周期快照事實表、累積快照事實表。注意:這里需要值得注意的是,在事實表的設計時,一定要注意一個事實表只能有一個粒度,不能將不同粒度的事實建立在同一張事實表中。
- 事務事實表,用于承載事務數據,通常粒度比較低,它是面向事務的,其粒度是每一行對應一個事務,它是最細粒度的事實表,例如產品交易事務事實、ATM交易事務事實。
- 周期快照事實表,按照一定的時間周期間隔(每天,每月)來捕捉業務活動的執行情況,一旦裝入事實表就不會再去更新,它是事務事實表的補充。用來記錄有規律的、固定時間間隔的業務累計數據,通常粒度比較高,例如賬戶月平均余額事實表。
累積快照事實表,用來記錄具有時間跨度的業務處理過程的整個過程的信息,每個生命周期一行,通常這類事實表比較少見。
2)維度表
維度,顧名思義,業務過程的發生或分析角度。比如從顏色、尺寸的角度來比較手機的外觀,從cpu、內存等較比比較手機性能維。維度表一般為單一主鍵,在ER模型中,實體為客觀存在的事物,會帶有自己的 描述性屬性,屬性一般為文本性、描述性的,這些描述被稱為維度。
比如商品,單一主鍵:商品ID,屬性包括產地、顏色、材質、尺寸、單價等, 但并非屬性一定是文本,比如單價、尺寸,均為數值型描述性的,日常主要的維度抽象包括:時間維度表、地理區域維度表等。
案例:某電商平臺,經常需要對訂單進行分析,以某寶的購物訂單為例,以維度建模的方式設計該模型。
涉及到事實表為訂單表、訂單明細表,維度包括商品維度、用戶維度、商家維度、區域維度、時間維度 :
- 商品維度:商品ID、商品名稱、商品種類、單價、產地等 。
- 用戶維度:用戶ID、姓名、性別、年齡、常住地、職業、學歷等 。
- 時間維度:日期ID、日期、周幾、上/中/下旬、是否周末、是否假期等。
維度分為:
(1)退化維度(DegenerateDimension)
在維度類型中,有一種重要的維度稱作為退化維度,亦維度退化一說。這種維度指的是直接把一些簡單的維度放在事實表中。退化維度是維度建模領域中的一個非常重要的概念,它對理解維度建模有著非常重要的作用,退化維度一般在分析中可以用來做分組使用。
(2)緩慢變化維(Slowly Changing Dimensions)
維度的屬性并不是始終不變的,它會隨著時間的流逝發生緩慢的變化,這種隨時間發生變化的維度我們一般稱之為緩慢變化維(SCD)。比如員工表中的部門維度,員工的所在部門有可能兩年后調整一次。
3)維度建模模型的分類
維度建模按數據組織類型劃分可分為星型模型、雪花模型、星座模型。
(1)星型模型
星型模型主要是維表和事實表,以事實表為中心,所有維度直接關聯在事實表上,呈星型分布。
(2)雪花模型
雪花模型,在星型模型的基礎上,維度表上又關聯了其他維度表。這種模型維護成本高,性能方面也較差,所以一般不建議使用。尤其是基于hadoop體系構建數倉,減少join就是減少shuffle,性能差距會很大。
提示:由上可以看出
星型模型和雪花模型主要區別就是對維度表的拆分。
對于雪花模型,維度表的涉及更加規范,一般符合3NF,有效降低數據冗余,維度表之間不會相互關聯。
而星型模型,一般采用降維的操作,反規范化,不符合3NF,利用冗余來避免模型過于復雜,提高易用性和分析效率,效率相對較高。
(3)星座模型
星座模型,是對星型模型的擴展延伸,多張事實表共享維度表。數倉模型建設后期,大部分維度建模都是星座模型。
4) 維度建模步驟
維度建模步驟:選擇業務過程->聲明粒度->確定維度->確定事實。旨在重點解決數據粒度、維度設計和事實表設計問題。
聲明粒度,為業務最小活動單元或不同維度組合。以共同粒度從多個組織業務過程合并度量的事實表稱為合并事實表,需要注意的是,來自多個業務過程的事實合并到合并事實表時,它們必須具有同樣等級的粒度。
- DataVault模型
Data Vault是Dan Linstedt發起創建的一種模型方法論,Data Vault是在ER模型的基礎上衍生而來,模型設計的初衷是有效的組織基礎數據層,使之易擴展、靈活的應對業務的變化,同時強調歷史性、可追溯性和原子性,不要求對數據進行過度的一致性處理。同時設計的出發點也是為了實現數據的整合,并非為數據決策分析直接使用。
Data Vault模型是一種中心輻射式模型,其設計重點圍繞著業務鍵的集成模式。這些業務鍵是存儲在多個系統中的、針對各種信息的鍵,用 于定位和唯一標識記錄或數據。
Data Vault模型包含三種基本結構 :
- 中心表-Hub :唯一業務鍵的列表,唯一標識企業實際業務,企業的業務主體集合 。
- 鏈接表-Link:表示中心表之間的關系,通過鏈接表串聯整個企業的業務關聯關系。
- 衛星表- Satellite:歷史的描述性數據,數據倉庫中數據的真正載體。
1) 中心表-Hub
2)鏈接表-Link
3)衛星表- Satellite
4)Data Vault模型建模流程
- 梳理所有主要實體
- 將有入邊的實體定義為中心表
- 將沒有入邊切僅有一個出邊的表定義為中心表
- 源苦衷沒有入邊且有兩條或以上出邊的表定義為連接表
- 將外鍵關系定義為鏈接表
提示:Hub想像成人體的骨架,那么Link就是連接骨架的韌帶組織, 而satelite就是骨架上的血肉。Data Vault是對ER模型更近一步的規范化,由于對數據的拆解和更偏向于基礎數據組織,在處理分析類場景時相對復雜, 適合數倉低層構建,目前實際應用場景較少。
- Anchor模型
Anchor是對Data Vault模型做了更近一步的規范會處理,初衷是為了 設計高度可擴展的模型,核心思想是所有的擴張只添加而不修改,于 是設計出的模型基本變成了k-v結構的模型,模型范式達到了6NF。
由于過度規范化,使用中牽涉到太多的join操作,目前木有實際案例,僅作了解。
4.四種模型總結
以上為四種基本的建模方法,當前主流建模方法為:ER模型、維度模型。
- ER模型常用于OLTP數據庫建模,應用到構建數倉時更偏重數據整合, 站在企業整體考慮,將各個系統的數據按相似性一致性、合并處理,為 數據分析、決策服務,但并不便于直接用來支持分析。缺陷:需要全面梳理企業所有的業務和數據流,周期長,人員要求高。
- 維度建模是面向分析場景而生,針對分析場景構建數倉模型;重點關注快 速、靈活的解決分析需求,同時能夠提供大規模數據的快速響應性能。針對性 強,主要應用于數據倉庫構建和OLAP引擎低層數據模型。優點:不需要完整的梳理企業業務流程和數據,實施周期根據主題邊界而定,容易快速實現demo。
- 數倉模型的選擇是靈活的,不局限于某一種模型方法。
- 數倉模型的設計也是靈活的,以實際需求場景為導向。
- 模型設計要兼顧靈活性、可擴展,而對終端用戶透明性。
- 模型設計要考慮技術可靠性和實現成本。
5.常用建模工具
建模工具,一般企業以Erwin、powerdesigner、visio,甚至Excel等為主。也有些企業自行研發工具,或使用阿里等成熟套裝組件產品。