摘 要:在數據倉庫建設中,維度的層次結構建模關系到數據組織、存儲、分析和展現,甚至會影響到數據挖掘的應用,是一個相當重要的設計過程。文章針對政府決策支持系統建設中常見的非齊整非平衡及混合的層次結構建模作了較深入的分析和研究,論述了采用星型模型和雪花模型實現非齊整非平衡及其混合層次結構的建模方法,并結合例子具體實現了在Omde數據倉庫中的類層次結構建模。
關鍵詞:非齊整層次結構;非平衡層次結構;混合層次結構;雪花模型;數據倉庫;聯機分析處理;電子政務
0引言
隨著國內電子政務建設的深入發展以及信息化程度的不斷提高,為提高決策的科學性和規范性,促進經濟發展,政府引入決策支持系統DSS(Decision Supported System)來輔助經濟、政策決策成為電子政務建設的一種發展趨勢。采用“數據倉庫(Data Warehouse)+聯機分析處理(On Line Analytical Processing)+數據挖掘(Data Mining)”為技術基礎的決策支持系統DSS是目前比較成熟的解決方案,數據倉庫實現了大量歷史業務數據的存儲和組織,聯機分析處理實現了數據的分析和展現,數據挖掘實現了知識發現。
不像電信和銀行的DSS(企業中的DSS有時也常常被稱為商業智能Business Intelligence)只針對本企業數據,政府DSS中的數據涉及到社會方方面面,從國民經濟到居民消費,從工業到農業,從科技到衛生等等,其特點是非相加的數據(nonadditive)和半相加的數據(semiadditive)居多;同時其數據的非齊整非平衡等特殊層次結構比較多。這些特點給數據倉庫的層次結構建模帶來了較多的設計和實現難度。
鑒于政府DSS中的數據特點,在設計過程中常常不能采用常用的星型模型建模,更多地需要采用雪花模型建模。
1層次結構(層次)
層次結構是維度中成員的集合以及這些成員之間的相對位置的描述,是組織數據的邏輯結構。通常講的下鉆(drilldown)就是指遍歷層次結構的一種行為,即從某一維層次結構的高層遍歷到細節低層;上卷(roll up)是在某一維上將低層次的細節數據概括到高層次的數據。層次結構是業務不可缺少的組成部分,同時也是數據倉庫和OLAP中要處理的基本問題。
層次組成方式主要有以級別(1evel-based)為基礎和以有父子關系的值(Parent Child Value-based)為基礎的二類組成方式。本文主要討論基于級別的層次組成方式,因為它在實際中更常見,更具有通用性。通常也把層次結構稱為層次樹,它是一種特殊的“父-子”聯系類型,孩子代表低層細節或父親的粒度。維表中的列代表了一個層次結構中特定的級別。因為維表中多個成員之間可能存在一種或多種關系,所以一個維表可以對應多種層次結構。層次結構存在以下幾種類型:
a.正常層次結構(Normal Hierarchy)
b.不齊整的層次結構(skip Hierarchy)
c.不平衡層次結構(Ragged Hierarchy)
d、不平衡和不齊整層次結構(Ragged with Skip Hierarchy)
另外,根據層次所在的維數據能否匯總,可分為聚集層次結構和非聚集層次結構。
1.1正常層次結構
正常層次結構指的是齊整和平衡的層次結構,它的所有層次分支都將降至具有相同級別的最低層次,并且每個成員的邏輯父代直接位于該成員的上一級別。比如在我國的行政建制的地域維中包括國家、省、市三個級別,它們組成的層次為“國家一省一市”,在不考慮直轄市的情況下,此層次結構就是齊整和平衡層次結構,如圖1所示。

1.2不齊整層次結構
不齊整層次結構中,各層次分支從高層遍歷到最低層所跨過的層次級別會有所不同,也就是說,至少有一個成員的邏輯父級不同于其它成員的父級。在上面提到的地域維中如果增加直轄市——上海,如圖2所示,由于直轄市上海的上一級不是省而是全國,上海市所隸屬分支的層次級別的組成將與其它分支不同,所以此層次結構為不齊整層次結構。
1.3不平衡層次結構
不平衡層次結構指的是各層次結構分支從高層往低層的遍歷過程中將降至具有不同級別的最低層次。如圖3所示GDP維層次分類,其“第一產業”分支沒有下層數據。
1.4不平衡及不齊整混合層次結構
不平衡及不齊整混合層次結構指的是既有不齊整分支也有不平衡分支的層次結構。如圖4所示層次結構,既包含不平衡分支和不齊整分支,還包含一條既有不平衡又有不齊整特性的分支。
1.5聚集層次結構與非聚集層次結構

在數據倉庫中通過層次結構,可以定義數據匯總/聚集。例如商品銷售中,從時間維分析,可以建立由級別月、季、年組成的“年一季一月”層次結構,從而可將月商品銷售額聚集成季度商品銷售額,季度商品銷售額再聚集成年度商品銷售額。具有此類可相加事實的層次結構就稱為聚集層次結構。而在數據倉庫中也存在一些事實值,它們并沒有表現出如商品銷售額那樣的相加性,如一個省的GDP增長率,將每年的增長率相加是沒有多少意義的,然而如果取其平均會得到一個有意義的數值,這樣的度量值被稱為半相加的事實。具有半相加的事實或非相加事實的層次結構為非聚集層次結構。如在全國一省一市層次中,各省的GDP增長率就不能由其下面各市的GDP增長率聚集而來,同樣全國的GDP增長率也不能由各省的GDP增長率聚集而成。省的GDP增長率、全國的GDP增長率必須作為事實存儲在數據倉庫事實表中。
有些特殊情況下,某些子類僅為父類的一部分成員,如在圖3所示的不平衡層次結構中,“第三產業”的下一級別的各個成員(#交通運輸郵電業、批零貿易餐飲業和舟金融保險業)僅僅為組成“第三產業”的一部分,子類與父類之間不存在數據聚集的關系。
對于在維度中預定義的聚集層次結構,可以實現數據匯總和鉆取功能。而對于非聚集的層次結構。我們主要是利用層次的數據鉆取功能,通過按層次的上卷和下鉆分析查看和展現數據。
2非齊整非平衡及其混合層次結構的建模
在政府DSS的建模中涉及非齊整層次結構、非平衡層次結構、非聚集層次結構或幾者的組合的情況比較多,其處理方法各不相同。下面分數據聚集和數據非聚集兩部分來論述它們的實現。
2.1數據聚集
2.1.1采用占位符的建模實現
對于數據是聚集的非正常層次結構,在建模過程中我們可以先對層次中的非齊整分支和非平衡分支分別作齊整化和平衡化處理。
齊整化是指用子級成員往上占用直接父級成員位置,如果子級成員與直接父級中間跨越多個級別,則一級一級用同一方法處理,從而實現非齊整層次的齊整化。如將圖2中的非齊整層次改造成圖5所示的齊整化層次,只要在上海市的直接父級即省級成員中填入占位符“上海市”。這樣處理后,全國聚集的值也是正確的,因為省級中的“上海市”是市級別中上海市的聚集值。

與非齊整層次處理方法類似,對于非平衡層次也可采用占位符進行平衡化,但與非齊整層次占位處理順序相反。非平衡結構的處理是用父級成員占用子級成員的位置,并一直迭代處理到層次的最低級別,也即將葉結點降至層次樹的最低層。平衡化過程如圖6中的Ragged Branch和Ragged with skipped-levelbrance分支所示。
圖6中也展示了不平衡及不齊整混合層次平衡化和齊整化的處理過程。改造后的層次適合常用的星型和雪花模型建模。實際上,上述解決方法是有一定的適用范圍的,如整個層次只是很少部分需“占位符”填補的時候采用這樣的解決方法能較好滿足實際需求。但是如果層次大部分的分支都不是“滿”的話,填補“占位符”的方法不僅費時,而且費力,在數據上卷和下鉆的過程中可能會遍歷幾次“占位符”才能看到具體的事實,這也會給用戶操作帶來許多的不便。特別是遍歷的層次超過業務本身邏輯的層次深度時,可能給用戶訪問帶來極大困難。
下面用占位符平衡化的“支出法生產總值”維層次為例,參見圖7,描述采用星型模型和雪花模型進行層次建模的方法。圖中帶下劃線文字為占位符。
星型模型建模示意如圖8所示。圖中事實表的列“GDP_分類”為外鍵,引用維表ZCFGDP_STAR_DIM的“LD”列,事實表與維表之間滿足參照完整性約束。
“支出法生產總值”雪花模型建模示意如圖9所示。數據倉庫中的雪花模型是對維度表采用了規范化處理,將圖8中的維表分解為四張子維表(采用雪花模型建模,維表的個數與維層次級別數相等),共同組成了“GDP_分類”維表。
在星型模型和雪花模型中事實表的“GDP_分類”列都為外鍵,引用維表中的“L-D”列(層次中最低級別),事實表與維表存在參照完整性約束,即事實表\"GDP_分類”列中存儲的是維層級中最低級別標識,實際上就是層次樹中葉結點標識。
在Oracle OLAP AW(OLAP分析空間一OLAP Analytic Workspace)中,數據倉庫采用為星型模型時,維表與OLAP維的映射采用星型模型,維表的列與維層次級別成員一一對應;數據倉庫為雪花模型時,維表與OLAP維的映射采用雪花模型,子維表的主鍵與維中對應級別成員一一對應,同時關聯其父類,映射關系與圖11所示類似。
在事實表與OLAP的CUBE映射中,事實表中“GDP_分類”關聯CUBE中對應維層次的最低級別,映射關系與圖12所示類似,但其只需關聯“LD”級別。

2.1.2利用OLAP雪花模型的建模
可以看到,通過“GDP_分類”維表下鉆“貨物和服務出口”數據,在上述星型建模和雪花模型中需遍歷“支出法生產總值->貨物和服務出口->貨物和服務出口->貨物和服務出口”才能看到“貨物和服務出口”的事實,在遍歷過程中要經過二個“占位符”。
而采用OLAP雪花模型建模可以有效地實現按業務邏輯層次的下鉆、分析展現。圖10展現的是利用OLAP雪花模型對“GDP_分類”維的建模。圖中帶箭頭的實線表示維表之間關聯引用,虛線標識出“GDP_分類”列的數據來源于層次樹中的葉子結點。
實現該模型,首先要用一系列關聯表實現維的層次,同時保證事實表的列“GDP分類”的值來自維表的多個特定列(包含有葉結點,葉結點代表具體事實值,非葉結點的值由葉結點聚集而成)。而在數據倉庫中的常規雪花模型中,事實表應與維表符合引用完整性,即事實表中的外鍵字都能分別與對應維表中的主關鍵字正確匹配。而目前數據庫外鍵不支持針對多個列的參照,所以圖lO所示的事實表與維表之間不滿足參照完整性約束。
在OLAP AW實現數據倉庫中的維表與OLAP維的映射如圖ll所示。
圖11左側的四張是在數據倉庫中已經過規范化處理的維表,借助外鍵形成級聯關系,符合3NF。維表中列與OLAP維層次級別中對應的“成員”和“父級”相關聯。
在OLAP AW中實現數據倉庫中事實表與CUBE映射如圖12所示。事實表“GDP_分類”關聯CUBE中具有計子結點的“L-B”“L-c”、“L_D”級別。當然為了安全起見,可以關聯維中所有級別。
由于數據按“GDP_分類”維是聚集的,在OLAP CUBE聚集規則中設置維的運算符為“求和”。
通過上面維表與OLAP維的映射以及事實表與CUBE映射的配置信息,再加上維表和事實表中存儲的數據,利用SQL和一些臨時表不難寫出實現數據聚集操作和過程。OLAP引擎也正是利用了這些必要的配置信息,實現數據聚集和其它分析展現功能。
從中可以看到,利用OLAP雪花模型實現層次建模比占位符展現邏輯更清晰,維表處理工作少,實際中更為常用。
2.2數據非聚集

數據非聚集的非正常層次結構在政府決策支持系統中更為常見,由于數據非聚集,事實表中維對應列的數據來源于層次樹中所有的結點標識。目前在Oracle OLAP AW中星型模型對此類層次建模暫不支持,采用OLAP雪花模型的建模方法比較簡明有效。
下面以圖3表示的“生產法生產總值”維為例說明采用OLAP雪花模型的非聚集層次建模。圖13展現了“生產法生產總值”數據倉庫中事實表與維表的關系。圖中帶箭頭的實線表示表之間關聯引用,虛線標識出“GDP分類”列的數據來源于層次樹中的所有結點。
“生產法生產總值”事實表與OLAP CUBE的映射,如圖15所示,事實表\"GDP_分類”與CUBE中關聯維中所有級別相關聯。
由于數據按“生產法生產總值”維是非聚集的,在OLAPCUBE聚集規則中設置維的運算符為“不求和”,如圖16所示。
從圖16中可以看到,在CUBE設置規則中處理的粒度是維,所以某一層次分支不聚集,整個維就只能采用不聚集(不求和)處理,即使有些分支聚集(如“生產法生產總值”層次的“第二產業”),也必須以事實的形式存儲在事實表中。
在OLAP AW中查看“生產法生產總值”的數據,其結果如
3結束語
在數據倉庫中層次建模主要依靠維表和事實表中與維對應列存儲的數據共同實現維的層次結構和層次邏輯,在層次建模中需格外注意它們之間的關系。數據聚集事實表對應列只能存儲層次樹中葉子結點的標識,非聚集則存儲的可以是層次樹中整個結點的標識。
在數據倉庫星型模型和雪花模型中是維表與事實表建立關系;在OLAP星型模型和雪花模型中是OLAP維與CUBE建立關系,OLAP維又與數據倉庫中對應的維表建立映射,CUBE又與數據倉庫中對應的事實表建立映射。數據倉庫中的雪花模型對于正常層次適用,對于非正常層次需改造維表;OLAP雪花模型功能則更為強大和靈活,可以直接處理非正常層次。數據倉庫中的維表和事實表是OLAP的基礎,數據倉庫中維表的設計直接影響到OLAP的展現的方式與正確性,實際建模過程中應盡量考慮利用OLAP星型和雪花模型的優勢,使數據展現分析更清晰、更符合業務層次。
另外,雖然雪花模型相對星型模型增加了處理表的數量,增加了查詢的復雜度,降低了部分性能,但其有效處理非齊整層次、非平衡層次和其混合層次的能力,在政府DSS實施中發揮了不可替代的作用。
(注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文。)