數據倉庫、數據集市建模

 

 

前言

        數據倉庫建模包含了幾種數據建模技術,除了之前在數據庫系列中介紹過的ER建模關係建模,還包括專門針對數據倉庫的維度建模技術。

        本文將詳細介紹數據倉庫維度建模技術,並重點討論三種基於ER建模/關係建模/維度建模的數據倉庫總體建模體系:規範化數據倉庫,維度建模數據倉庫,以及獨立數據集市。

 

維度建模的基本概念

        維度建模(dimensional modeling)是專門用於分析型數據庫、數據倉庫、數據集市建模的方法。

        它本身屬於一種關係建模方法,但和之前在操作型數據庫中介紹的關係建模方法相比增加了兩個概念:

        1. 維度表(dimension)

        表示對分析主題所屬類型的描述。比如"昨天早上張三在京東花費200元購買了一個皮包"。那麼以購買爲主題進行分析,可從這段信息中提取三個維度:時間維度(昨天早上),地點維度(京東), 商品維度(皮包)。通常來說維度表信息比較固定,且數據量小。

        2. 事實表(fact table)

        表示對分析主題的度量。比如上面那個例子中,200元就是事實信息。事實表包含了與各維度表相關聯的外碼,並通過JOIN方式與維度表關聯。事實表的度量通常是數值類型,且記錄數會不斷增加,表規模迅速增長。

        注:在數據倉庫中不需要嚴格遵守規範化設計原則(具體原因請看上篇)。本文示例中的主碼,外碼均只表示一種對應關係,此處特別說明

 

維度建模的三種模式

        1. 星形模式

        星形模式(Star Schema)是最常用的維度建模方式,下圖展示了使用星形模式進行維度建模的關係結構:

        可以看出,星形模式的維度建模由一個事實表和一組維表成,且具有以下特點:

                a. 維表只和事實表關聯,維表之間沒有關聯;

                b. 每個維表的主碼爲單列,且該主碼放置在事實表中,作爲兩邊連接的外碼;

                c. 以事實表爲核心,維表圍繞核心呈星形分佈;

        2. 雪花模式

        雪花模式(Snowflake Schema)是對星形模式的擴展,每個維表可繼續向外連接多個子維表。下圖爲使用雪花模式進行維度建模的關係結構:

        星形模式中的維表相對雪花模式來說要大,而且不滿足規範化設計。雪花模型相當於將星形模式的大維表拆分成小維表,滿足了規範化設計。然而這種模式在實際應用中很少見,因爲這樣做會導致開發難度增大,而數據冗餘問題在數據倉庫裏並不嚴重。

        3. 星座模式

        星座模式(Fact Constellations Schema)也是星型模式的擴展。基於這種思想就有了星座模式:

 

        前面介紹的兩種維度建模方法都是多維表對應單事實表,但在很多時候維度空間內的事實表不止一個,而一個維表也可能被多個事實表用到。在業務發展後期,絕大部分維度建模都採用的是星座模式。

        4. 三種模式對比

        歸納一下,星形模式/雪花模式/星座模式的關係如下圖所示:

        雪花模式是將星型模式的維表進一步劃分,使各維表均滿足規範化設計。而星座模式則是允許星形模式中出現多個事實表。本文後面部分將具體講到這幾種模式的使用,請讀者結合實例體會。

 

實例:零售公司銷售主題的維度建模

        在進行維度建模前,首先要了解用戶需求。而筆者在數據庫系列的第一篇就講過,ER建模是當前收集和可視化需求的最佳技術。因此假定和某零售公司進行多次需求PK後,得到以下ER圖:

        隨後可利用建模工具將ER圖直接映射到關係圖: 

        需求蒐集完畢後,便可進行維度建模了。本例採用星形模型維度建模。但不論採取何種模式,維度建模的關鍵在於明確下面四個問題:

        1. 哪些維度對主題分析有用?

        本例中,根據產品(PRODUCT)、顧客(CUSTOMER)、商店(STORE)、日期(DATE)對銷售額進行分析是非常有幫助的;

        2. 如何使用現有數據生成維表?

                a. 維度PRODUCT可由關係PRODUCT,關係VENDOR,關係CATEGORY連接得到;

                b. 維度CUSTOMER和關係CUSTOMER相同;

                c. 維度STORE可由關係STROE和關係REGION連接得到;

                d. 維度CALENDAR由關係SALESTRANSACTION中的TDate列分離得到;

        3. 用什麼指標來"度量"主題?

        本例的主題是銷售,而銷量和銷售額這兩個指標最能直觀反映銷售情況;

        4. 如何使用現有數據生成事實表?

        銷量和銷售額信息可以由關係SALESTRANSACTION和關係SOLDVIA,關係PRODUCT連接得到;

        明確這四個問題後,便能輕鬆完成維度建模:

        細心的讀者會發現三個問題:1. 維表不滿足規範化設計(不滿足3NF);2. 事實表也不滿足規範化設計(1NF都不滿足); 3. 維度建模中各維度的主碼由***ID變成***Key;

        對於前兩個問題,由於當前建模環境是數據倉庫,而沒有更新操作,所以不需要嚴格做規範化設計來消除冗餘避免更新異常。

        因此雖然可以以雪花模型進行維度建模,如下所示: 

        但這樣會加大查詢人員負擔:每次查詢都涉及到太多表了。因此在實際應用中,雪花模型僅是一種理論上的模型。星座模型則出現在"維度建模數據倉庫"中,本文後面將會講到。

        對於第三個問題,***Key這樣的字段被稱爲代理碼(surrogate key),它是一個通過自動分配整數生成的主碼,沒有任何其他意義。使用它主要是爲了能夠處理"緩慢變化的維度",本文後面會仔細分析這個問題,這裏不糾結。

 

更多可能的事實屬性

        除了對應到維度的外碼和度量屬性,事實表中還常常考慮另外兩個屬性:事務標識碼(transaction identifier)和事務時間(transaction time)。

        事務標識碼通常被命名爲TID,其意義就是各種訂單號,事務編號...... 爲什麼將這個屬性放到事實表而不是維表中呢?一個主要原因是它的數量級太大了,這樣每次查詢都會耗費很多資源來Join。這種將某些邏輯意義上的維度放到事實表裏的做法被稱爲退化維度(degenerate dimension)。

        將事務時間維度放到事實表中的考慮也是出於相同考慮。然而這麼設計又一次"逆規範化"了:事務標識碼非主碼卻決定事務標識時間,顯然違背了3NF。但現在我們是爲數據倉庫建模,所以這樣做是OK的。另外在分佈式的數據倉庫中,這個字段十分重要。因爲事實表的數量級非常大,Hive或者Spark SQL這類分佈式數據倉庫工具都會對這些數據進行分區。任何成熟的分佈式計算平臺中都應禁止開發人員建立非分區事實表,並默認分區字段爲(當天)日期。

 

經典星座模型

        前文已經講過,有多個事實表的維度模型被稱爲星座模型。星座模型主要有以下兩大作用:共享維度和設置細節/聚集事實表。下面分別對這兩種情況進行分析:

        1. 共享維度

        以前文提到的零售公司爲例,假如該公司質量監管部門希望用分析銷售主題同樣的方法分析劣質產品,那麼此時不需要重新維度建模,只需往模型里加入一個新的劣質產品事實表。之後新的數據倉庫維度建模結果如下:

        2. 細節/聚集事實表

        細節事實表(detailed fact tables)中每條記錄表示單一事實,而聚集事實表(aggregated fact tables)中每條記錄則聚合了多條事實。從表的字段上看,細節事實表通常有設置TID屬性,而聚集事實表則無。

        兩種事實表各有優缺點,細節事實表查詢靈活但是響應速度相對慢,而聚集事實表雖然提高了查詢速度,但使查詢功能受到一定限制。一個常見的做法是使用星座模型同時設置兩種事實表(可含多個聚集事實表)。這種設計方法中,聚集事實表使用和細節事實表細節事實表的維度。如下維度建模方法採用星座模型綜合了細節事實表和兩種聚集事實表:

 

緩慢變化維度問題

        雖然,維表的數據比事實表更穩定。但不論如何維度在某些時候總會發生一些變化。在之前曾拋出一個問題:爲什麼維度建模後的關係不是***ID,而是***Key了。這樣做的目的其實就是爲了解決一種被稱爲緩慢維度變化(slowly changing dimension)的問題。在維度變化後,一部分歷史信息就被丟掉了。比如張三是某公司會員。

        但僅僅這麼做還是不夠的,代理碼需要配合時間戳,以及行標識符使用才能解決緩慢維度變化的問題。如下CUSTOMER表使用該方法避免緩慢維度變化:

        可以看到用戶張三對應新維度的TaxBracket狀態由Low變成了High。如果需要統計張三的相關行爲,那麼可以讓所有記錄用CustomerID字段Join事實表;如果要統計當前TaxBracket爲Low的用戶狀態,則可將Row Indicator字段爲Current的記錄用CustomerKey字段Join事實表;如果要統計歷史TaxBracket狀態爲Low的用戶情況,則只需要將TaxBracket屬性爲Low的用戶記錄的CustomerKey屬性與事實表關聯。

 

數據倉庫建模體系之規範化數據倉庫

        所謂"數據倉庫建模體系",指的是數據倉庫從無到有的一整套建模方法。最常見的三種數據倉庫建模體系分別爲:規範化數據倉庫,維度建模數據倉庫,獨立數據集市。很多書將它們稱爲"數據倉庫建模方法",但筆者認爲數據倉庫建模體系更能準確表達意思,請允許我自作主張一次吧:)。下面首先來介紹規範化數據倉庫。

        規範化數據倉庫(normalized data warehouse)顧名思義,其中是規範化設計的分析型數據庫,然後基於這個數據庫爲各部門建立數據集市。總體架構如下圖所示:

        該建模體系首先對ETL得到的數據進行ER建模,關係建模,得到一個規範化的數據庫模式。然後用這個中心數據庫爲公司各部門建立基於維度建模的數據集市。各部門開發人員大都從這些數據集市提數,通常來說不允許直接訪問中心數據庫。    

 

數據倉庫建模體系之維度建模數據倉庫

        非維度建模數據倉庫(dimensionally modeled data warehouse)是一種使用交錯維度進行建模的數據倉庫,其總體架構如下圖所示:

        該建模體系首先設計一組常用的度集合(conformed dimension),然後創建一個大星座模型表示所有分析型數據。如果這種一致維度不滿足某些數據分析要求,自然也可在數據倉庫之上繼續構建新的數據集市。

 

數據倉庫建模體系之獨立數據集市

        獨立數據集市的建模體系是讓公司的各個組織自己創建並完成ETL,自己維護自己的數據集市。其總體架構如下圖所示:

        從技術上來講這是一種很不值得推崇的方式,因爲將使信息分散,影響了企業全局範圍內數據分析的效率。此外,各組織之間的ETL架構相互獨立無法複用,也浪費了企業的開發資源。然而出於某些公司制度及預算方面的考慮,有時也會使用到這種建模體系。

 

三種數據倉庫建模體系對比

        規範化數據倉庫和維度建模數據倉庫分別是Bill Inmon和Ralph Kimball提出的方法。關於哪種方法更好,哪種方法更優秀的爭論已經由來已久。但隨着這兩種數據倉庫應用越來越多,人們也逐漸瞭解到兩種數據倉庫的優劣之處,如下表所示:

        產生這些區別的根本之處在於規範化數據倉庫需要對企業全局進行規範化建模,這將導致較大的工作量。但這一步必須完成好,才能繼續往上建設數據集市。因此也就導致規範化數據倉庫需要一定時間才能投入使用,敏捷性相對後者來說略差。但是規範化數據倉庫一旦建立好了,則以後數據就更易於管理。而且由於開發人員不能直接使用其中心數據庫,更加確保了數據質量。還有由於中心數據庫是採用規範化設計的,冗餘情況也會更少。

        然而另一方面維度建模數據倉庫除了敏捷性更強,而且適用於業務變化比較頻繁的情況,對開發人員的要求也沒有規範化數據倉庫那麼高。總之各有利弊,具體實施時需要仔細的權衡。

 

小結

        數據倉庫建模是一個綜合性技術,需要使用到ER建模、關係建模、維度建模等技術。而且當企業業務複雜的時候,這部分工作更是需要專門團隊與業務方共同合作來完成。因此一個優秀的數據倉庫建模團隊既要有堅實的數據倉庫建模技術,還要有對現實業務清晰、透徹的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章