維度建模—維度表設計


大家好,我是雲祁!今天和大家聊聊數據倉庫中維度表設計的那些事。

維度表是維度建模的靈魂所在,在維度表設計中碰到的問題(比如維度變化、維度層次、維度一致性、維度整合和拆分等)都會直接關系到維度建模的好壞,因此良好的維表設計就顯得至關重要,今天就讓我們就一起來探究下關於維表設計的相關概念和一些技術。

維度變化

維度表的數據通常來自於前台業務系統,比如商品維度表可能來自於 ERP 或者超市 POS 系統的商品表,但商品是會發生變化的,比如商品所屬的類目 、商品標簽價格、商品描述等,這些變化有可能是之前有錯誤需要訂正所致的,或者是實際的業務情況變化。

不管哪種情況,維度設計過程中,確定源頭數據變化在維度表中如何表示非常重要。因此在維度建模中,這一現象稱為緩慢變化的維度,簡稱 緩慢變化維(slowly changing dimension, SCD)。

根據變化內容的不同,下游的分析可能要求用不同的辦法來處理

比如對於商品的描述信息,也許業務人員對此並不敏感,或者認為無關緊要,這種情況可以直接覆蓋 。

但是對於商品所屬的類目發生變化,則需要認真考慮, 因為這涉及歸類這個商品的銷售活動到哪個類目一一是全部歸到新類目,還是全部歸到舊類目?變化前歸到舊類目,還是變化后歸到新類目?這實際上也涉及了下面要分享的緩慢變化維的幾種處理辦法。

1. 重寫維度值

當一個維度值屬性發生變化時,重寫維度值方法直接用新值覆蓋舊值。

該技術適用於維度建模中不需要保留此維度屬性歷史變化的情況,常用於錯誤訂正或者維度屬性改變無關緊要的場景,比如用戶的生日之前發生輸入錯誤,不需要保留之前的生日歷史數據。

那么采用重寫維度值的方法,就將會改變此維度屬性的所有歷史度量。

比如,分析師希望分析星座和銷售的關系,之前用戶的生日屬於白羊座,但是修改后的生日屬於雙子座,那么維度屬性修改后,其銷售額將都屬於雙子座。因此維度設計人員只在必要情況下使用此方法,同時需要告知下游分析人員。

采用重寫維度值方法的維度表和事實表變化如圖:



采用重寫維度值方法處理變化維示例

2. 插入新的維度行

相比重寫維度值方法不維護維度屬性變化的特點,插入新的維度行方法則通過在維度表中插入新的行來保存和記錄變化的情況。

屬性改變前的事實表行和舊的維度值關聯,而新的事實表行和新的維度值關聯。



采用插入新的維度行方法處理緩慢變化維示例

我們仔細觀察變化后的維度表可以發現,新復制了一行該用戶的信息,唯一不同在於 state 的不同(之前是 AZ,之后是 CA)。同時,仔細觀察訂單事實表也會發現,過去的訂單是和舊的唯獨行關聯,而新的訂單和新的維度行關聯。

通過新增維度行,我們保存了維度的變化,並實現了維度值變化前的 實和變化后的事實分別與各自的新舊維度值關聯。

但是這也給維度表用戶帶來了困惑,為什么查詢會員會在維度表中發現多行記錄?盡管可以向用戶解釋,但是用戶的使用和學習成本無疑增加了, 而且數據開發人員對於維度變化的處理邏輯無疑更復雜了。

3. 插入新的維度列

在某些情況下,可能用戶會希望既能用變化前的屬性值,又能用變化后的屬性值來分析變化前后的所有事實。此時可以采用插入新的維度列這種方法。



采用插入新的維度列處理緩慢變化維示例

不同於前一種方法的添加一行,這種方法通過新增一列,比如用 region_previous 列表示之前的所屬大區,同時新增 region_current 來表示變化后的所屬大區。如果有多次變化,就需要有多個列來存儲。

實際上,這三種方法都能從不同角度解決維度變化的問題,還有通過組合這三種方法形成的其他各種技術可用於處理維度變化,這里就不再贅述。

當然了,不管哪種技術,在大數據時代都不是完美的,而且有一定的處理復雜度和學習使用成本。

如何以一種最簡單、直接的辦法來解決維度變化呢?我們在后面會聊聊 快照技術 ,以解決大數據時代的維度變化問題。

維度層次

維度層次指的是某個維度表中屬性之間存在的從屬關系問題。比如商品的類目可能是有層次的(一級類目、二級類目、三級類目等,尤其對於寶潔、聯合利華等大的快消企業集團),同時類目、品牌和產品實際上也是有層次的。那么維度建模如何處理這些層次結構呢?

實際上有兩種處理辦法:

  1. 第一種是將所有維度層次結構全部扁平化、冗余存儲到一個維度表中,比如商品的一至三級類目分別用三個字段來存儲,品牌等的處理也是類似的;
  2. 第二種是新建類目維度表,並在維度表中維護父子關系。

第一種其實就是星型架構,第二種是雪花架構。在維度建模中,我們采用第一種來處理維度的層級問題,這樣反規范化的處理犧牲了部分存儲,但是給用戶使用帶來了便捷,也降低了學習使用成本。

維度的層次結構通常和鑽取聯系在一起,所謂鑽取即是對信息的持續深入挖掘。

鑽取分為向上鑽取和向下鑽取,比如對於某零售商的年度銷售報表,其年度銷售總額顯示增長20%,那么從時間上分析是哪個季度的增長率比較高呢?

此時可以向下分析各個季度的增長率,同樣可以繼續向下分析到月增長率乃至天增長率,同樣的分析也可以應用到類目 、品牌等,來分析到底是哪個類目的增長或者哪個品牌的增長導致了年度總銷售額的增長 20% 。這就是向下鑽取。

與之相對的是向上鑽取,鑽取的實質是增加或者減少維度,增加維度(向下鑽取)從匯總數據深入到細節數據,而減少維度(向上鑽取)則從細節數據概括到匯總數據 。通過鑽取,用戶對數據能更深入地了解數據,更容易發現問題,從而做出正確的決策。

維度一致性

在 Kimball 的維度設計理論中,並沒有物理上的數據倉庫。數據倉庫是在對多個主題、多個業務過程的多次迭代過程中逐步建立的,這些多個問題、多個業務過程的多次迭代過程常被從邏輯上划分為數據集市。

所謂數據集市一般由一張和多張緊密關聯的事實表以及多個維度表組成,一般是部門級的或者面向某個特定的主題。數據倉庫則是企業級的、面向主題的、集成的數據集合。

物理上的數據集市組合成邏輯上的數據倉庫, 旦數據集市的建立是逐步完成的,如果分步建立數據集市的過程中維度表不一致,那么數據集市就會變成孤立的集市,不能從邏輯上組合成一個集成的數據倉庫,而維度一致性的正是為了解決這個問題。

維度一致性的意思是指:兩個維度如果有關系,要么就是完全一樣的,要么就是一個維度在數學意義上是另一個維度的子集。

不一致既包含維度表內容的不 致,也包含維度屬性上的不一致。

  • 比如對於一個電子商務公司,如果其瀏覽等相關主題域的商品維度表包含了該企業的所有商品的訪問信息,但是由於某種原因其交易域的商品缺失了部分商品 (有可能是成交在其他平台完成),那么對這些缺失商品的交易分析就無法完成 。
  • 同樣如果兩的商品屬性不同,比如日期格式、類目划分(有可能瀏覽分為前天類目,成交是后台類自)等不一致,那么跨瀏覽域和交易域的對類目和日期的交叉分析就無法進行,因為其類目划分就不一致。

維度一致性對於數據集市成為數據倉庫起着關鍵作用,實際數據集市設計和開發過程中,必須保證維度一致性,具體可以采用共享同一個維度表或者讓其中一個維度表是另外一個維度表的子集等方式來保證一致性,從而避免孤立數據集市的出現。

維度整合和拆分

實際維度表設計中,有時候會出現同一個維度表來自於多個前台業務系統的問題,此時就會帶來維度整合和拆分問題。

前台的業務系統通常是比較復雜的,比如移動端交易系統和PC端交易系統的系統架構和底層數據庫、表結構等完全不一致,此時就存在維度的整合問題。

在實際整合中,同一個維度整合需要考慮如下問題:

  • 命名規范:要確保一致和統一
  • 字段類型 :統一整合為一個字段類型
  • 字段編碼和含義:編碼及含義要整合為一致

與整合相對的是拆分

對於大的集團公司來說,以中石化為例,其主業為成品油銷售,但是同時其還有中石化加油站的快捷零售店(在此僅做說明問題使用),它們的商品表字段和屬性由於業務的不同而存在很大的差異(石油商品和零售店銷售的食品、飲料等)。

此時需要用一個統一整合的商品表么(從直覺來說是不需要的,因為業務差異巨大)?

在維度建模理論中,對於上述情況通常有兩種處理辦法

  1. 建一個基礎的維度表, 此基礎維度表包含這些不同業務的共有屬性,同時建立各自業務的單獨維度表以包含其獨特的業務屬性。比如,上述例子就可以建立一個共有的商品維度表記錄商品價格、商品描述等共有屬性字段,同時建立成品油銷售的商品維度表記錄油標號( 92 95 97 等)等成品油獨特的商品屬性,另外建立一個零售商品維度表記錄便利店的各種商品屬性(實際操作中通常先建立兩個單獨的維度表,然后基於單獨維度表生成共有的商品維度表或者視圖)
  2. 拆分,即不合並,即各個業務差異獨特性的業務各自建立完全獨立的兩個維度表,各自管理各自維度表和屬性。

我們在實際操作中 ,對於業務差異大的業務,偶合在一起並不能帶來很大的便利和好處,因此通常傾向於拆分(即不合並),各自管理各自的維度表。而對於業務相似度比較大的業務,則可以采用上述的第一種方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM