數據倉庫?真的有必要嗎?
我曾經和一個業務系統負責人聊起數據倉庫,他感到很疑惑,“我們數據庫里不是有現成的數據嗎?你們數據分析師直接用就好了,為什么還要花人力物力去建設什么數據倉庫”,最后甚至直接說“我們的數據庫就是你要的數據倉庫”。
為什么公司要建立數據倉庫,而不直接使用業務系統保存的數據?
回答這個問題之前,我們先來看看業務系統數據庫和數據倉庫的區別。
業務系統需要確保自身的正常運轉,并能快速的處理事務,因此一般是一次處理一個事務。通過與用戶的交互,將注冊信息、訂單信息、活動狀態、用戶投訴等信息記錄下來。業務系統只要根據既定的業務過程完成相應的任務即可,因此,業務系統通常不用維護歷史數據,只需修改數據以反映業務的最新狀態。
如:我續費了一年的視頻會員,在我付完款后,視頻App里的會員狀態就要及時更新
而數據倉庫用于分析企業的運營狀況,計算新成交的訂單金額,對比過去一個月找到成交金額波動的原因,通過用戶提交的投訴找到用戶不滿意的根源。數據倉庫不會一次只處理一個事務,因為用戶的一次查詢通常需要搜索成千上萬條事務,并將查詢結果放入到一個查詢集合中。而且,為了滿足更廣闊的分析需求,數據倉庫通常需要保存歷史數據,以便于能精確評估公司在某一段時間內的經營情況。
如:用戶每次續費視頻會員時,數據倉庫需要記錄下每次狀態的改變,以用于后續場景的復現和分析。
因此,業務系統和數據倉庫面向的用戶及其需求是完全不一樣的。
- 關聯取數效率低
業務系統的數據庫設計基本滿足三范式,因此取數分析時需要關聯很多的數據表才能得到想要的數據,比較麻煩,而且數據還無法復用,導致分析效率比較低。

- 無法支持某些分析場景
基于業務系統數據的特性,往往不能支持某些場景的分析。業務系統不記錄歷史數據,只保留當前狀態,比如我們想知道某個視頻會員從試用、開通、使用、到期這段時間內的完整情況,但是業務系統里只有最新的會員等級和到期時間,是無法支持這種場景下的分析的。
你可能經常在企業經營管理者口中聽到這些:
1)我們收集了海量的數據,但是一直無法充分利用起來
2)我們需要以各種方式方便的對數據進行處理
3)業務/運營/銷售/分析/算法需要更加方便的獲取數據
4)我需要隨時隨地了解企業的經營狀況, 并將最值得關注的內容展示給我
5)會議自始至終爭論的是誰的數據正確,而不是聚焦于分析和決策
6)希望管理者能夠使用數據來制定基于事實的決策
而以上問題構成了數據倉庫系統的基本需求。
數倉分層設計
數據總是用于兩個目的,業務系統的應用和分析決策的制定。將數據縱向分層,將一個復雜的數據處理任務拆解成多個步驟來完成,每一層只處理一個步驟,簡單且容易理解。
將數據倉庫分為三層:
- 數據引入層(ODS,Operational Data Store)
- 數據公共層(CDM,Common Dimenions Model)
- 數據應用層(ADS,Application Data Store)

數據引入層(ODS):與目前業務數據庫中的數據保持一致,方便核對數據,追溯源頭。
數據公共層(CDM):維度表(DIM)、公共匯總層(DWS)、明細事實表(DWD)
以維度模型方法作為理論基礎,提高明細數據表的易用性,提升公共指標的復用性,減少重復加工。
數據應用層(ADS):數據產品和數據報表的數據來源
數據分析師一般使用的是公共層,里面有維度數據,明細數據和輕度匯總數據,基本能滿足各類分析需求。
維度建模方法
ODS層中的數據與業務數據庫中的數據基本保持一致。業務系統是按照流程組織數據的,為保證流程的完整和使用的方便,并沒有按照業務的本質來組織數據,不適合做分析和挖掘。
對于數倉來說,最重要的就是CDM公共層,從業務完整性的角度出發,不考慮系統流程,重新組織數據。公共層的目標是建設一套覆蓋全業務域、涵蓋所有歷史數據的企業數據體系,利用這套數據體系可以還原企業在任意時刻的業務運轉狀態。
建設CDM公共層最常用的技術就是維度建模,因為它更適合大數據時代數據量巨大的特點。簡單來說,就是一張事實表+多張維度表。

當所有維表都直接連接到“ 事實表”上時,整個圖解就像星星一樣,故也將該模型稱為星型模型。
與業務系統的數據結構對比,我們可以發現,維度建模有以下特點:
1)模型簡單易理解
站在業務的角度上,用“一張事實表+多張維度表”的模式組織數據,僅有維度、事實兩種類型數據。可以簡單的理解星型模型,就是我們把where和group后面的字段放入維度表中,把sum和count中的字段放入事實表中,并在事實表中加入維度的鍵值用于關聯。
2)可擴展性好
可以在不改變數據粒度的情況下,方便地增加新的分析維度和事實,不會影響正在使用的報表和數據應用。
4)數據冗余
構建維度表和事實表都需要大量的數據預處理,導致大量的ETL工作,并且可以看出,相比業務系統的精簡,星型模型明顯是“用空間換易用和效率”,存在大量的數據冗余。