1. 程式人生 > 實用技巧 >維度建模之事實表

維度建模之事實表

1.事實表概述 事實表儲存了從業務活動或事件提煉出來的效能度量,它主要包含維度表的外來鍵和連續變化的可加性數值、半可加事實和不可加事實。事實表產生於業務過程中而不是業務過程的描述性資訊。它一般是行多列少,佔了資料倉庫的90%的空間。在維度模型中也有表示多對多關係的事實,其他都是維度表。 2.事實表粒度 事實表的粒度是產生事實行的度量事件的業務定義。粒度確定了事實表的業務主鍵, 事實表的所有度量值必須具有相同的粒度。 3.事實表設計原則 原則一:儘可能包含所有業務與業務過程相關的事實 事實表設計的目的是為了度量業務過程,所以分析哪些事實與業務過程有關式設計中非常重要的關注點。 在事實表中應該儘量包含所有與業務過程相關的事實,即使存在冗餘,但是因為事實通常為數字型,帶來的儲存開銷也不會很大。 原則二:只選擇與業務過程相關的事實 在選擇事實是,應該注意只選擇與業務過程有關的事實。 比如在訂單下單這個業務過程的事實表設計中,不應該存在支付金額這個表示支付業務過程的事實。 原則三:分解不可加性事實為可加的元件 對於不具備可加性條件的事實,需要分解為可加的元件。 比如訂單的優惠率,應該分級為訂單原價金額與訂單優惠金額兩個事實儲存在事實表中。 原則四:在選擇維度和事實之前必須宣告粒度 粒度的宣告是事實表設計中不可忽視的重要一步,粒度用於確定事實表中一行所表示業務的細節層次,決定了維度模型的擴充套件性,在選擇維度和事實之前必須宣告粒度,且每個維度和事實必須與所定義的粒度保持一致。 在設計事實表的過程中,粒度定義得越細越好,建議從最低級別的原則粒度開始,因為原子粒度提供了最大限度的靈活性,可以支付無法預期的各種細節層析的使用者需求。 在事實表中,通常通過業務描述來表述粒度,但對於聚集性事實表的粒度描述,可以採用維度或維度屬性組合的方式。 原則五:在同一個事實表中不能有多種不同粒度的事實 事實表中的所有事實需要與表定義的粒度保持一致,在同一個事實表中不能有多種不同粒度的事實。 原則六:事實的單位要保持一致 對於同一個事實表中實施的單位,應該保持一致。 比如原訂單金額、訂單優惠金額、訂單運費金額這三個事實,應該採用一致的計量單位,統一為元或分,以方便使用。 原則七:對事實的null值要處理 對於事實表中實施度量null值的處理,因為在資料庫中null值對常用數字型欄位的SQL過濾條件都不生效,比如大於、小於、等於、大於或等於、小於或等於,建議用0值填充。 原則八:使用退化維度提高事實表的易用性 在Kimball的維度建模中,通常按照星型模型的方法來設計,對於維度的獲取採用的是通過事實表的外來鍵關聯專門的維表方式,謹慎使用退化。 而在大多數領域的事實表設計中,則大量採用退化維度的方式,在事實表中儲存各種型別的常用維度資訊。這樣設計的目的主要是為了減少下游使用者使用時關聯多個表的操作,直接通過退化維度實現對事實表的過濾查詢、控制聚合層次、排序資料以及定義主從關係等。 通過增加冗餘儲存的方式減少計算開銷,提高使用效率; 4.事實表設計方法 在Kimball所著的《The Data Warehouse Toolkit-The Definitive Guide to Dimensional Modeling》一書中,對於維度模型設計採用四部設計方法:
  • 選擇業務過程
  • 宣告粒度
  • 確定維度
  • 確定事實
5.事實表的分類
  • 維度建模數倉領域中的事實表大致分以下三種:事務事實表,週期快照事實表,累計事實表。
  • 事務事實表與週期快照事實表、累積快照事實表雖然使用相同的一致性維度,但是它們在內容構成以及業務描述上還是有很大的區別。
  • 事務事實表:它是面向事務的,其粒度是每一行對應一個事務,它是最細粒度的事實表。
  • 週期快照事實表:它是按照良好的時間週期間隔(每天,每月)來捕捉業務活動的執行情況,一旦裝入事實表就不會再去更新,它是事務事實表的補充,而非替代品。
  • 累積快照事實表:它用於描述業務過程中某個不確定時間跨度裡的活動,它隨著業務活動的發生會不斷的更新。
5.1 事務事實表 事務事實表記錄的事務層面的事實,儲存的是最原子的資料,也稱“原子事實表”。事務事實表中的資料在事務事件發生後產生,資料的粒度通常是每個事務記錄一條記錄。一旦事務被提交,事實表資料被插入,資料就不再進行更改,其更新方式為增量更新。由於事實表具有稀疏性質 ,因此只有當天資料才會進入 當天的事實表中,相當於每個分割槽裡面都是每天的資料,不包含之前的資料。 事務事實表的日期維度記錄的是事務發生的日期,它記錄的事實是事務活動的內容。使用者可以通過事務事實表對事務行為進行特別詳細的分析。 說明1:為什麼事務事實表具有稀疏性質? 事實表一般圍繞著度量來建立,當度量產生的時候,事實記錄就生成了。度量可以是銷售數量、交易流水值、月末節餘等數值。如果同時生成多個度量值的話,我們可以在一個事實表中建立多個事實。當我們的事實表中的事實比較多時,有可能多個事實不同時發生,如果同時生成的機率很小,我們稱之為稀疏事實表(Sparse Facts)。 5.2 週期快照事實表 週期快照事實表以具有規律性的、可預見的時間間隔來記錄事實,時間間隔如每天、每月、每年等等。典型的例子如銷售日快照表、庫存日快照表等。它統計的是間隔週期內的度量統計,如歷史至今、自然年至今、季度至今等等。 週期快照表沒有粒度的概念,取而代之的是週期+狀態度量的組合,如歷史至今的訂單總數,其中歷史至今是一個週期,訂單總數是度量。 週期快照事實表的粒度是每個時間段一條記錄,通常比事務事實表的粒度要粗,是在事務事實表之上建立的聚集表,比如說時間週期是1周,那麼這個週期快照事實表的一條記錄就是這一週的對於某個度量的統計值(我理解的)。 週期快照事實表的維度個數比事務事實表要少,但是記錄的事實要比事務事實表多(為什麼記錄的事會比事務事實表表多呢?)。事務事實表是稀疏表,週期快照表是稠密表。 說明1:什麼是稀疏表,什麼是稠密表? 稀疏表:當天只有發生了操作才會有記錄 稠密表:當天沒有操作也會有記錄,便於下游使用 週期快照事實表的日期維度通常是記錄時間段的終止日,記錄的事實是這個時間段內一些聚集事實值。事實表的資料一旦插入即不能更改,其更新方式為增量更新。 說明2:為什麼週期快照事實表紀錄的紀錄會比事務事實表多呢? 事務事實表是稀疏的,只有當天發生的業務過程,事實表才會記錄該業務過程的事 實, 如下單、支付等;而快照事實表是稠密的,無論當天是否有業務過程發 生,都會記錄一行,比如針對賣家的歷史至今的下單和支付金額,無論 當天賣家是否有下單支付事實,都會給該賣家記錄一行。 假如賣家之前下單6筆,昨天沒有下單,但是還是會給他在昨天的分割槽裡面紀錄它截止目前為止下單6筆的紀錄。 5.3 累計快照事實表 累積快照事實表和週期快照事實表有些相似之處,它們儲存的都是事務資料的快照資訊。但是它們之間也有著很大的不同,週期快照事實表記錄的確定的週期的資料,而累積快照事實表記錄的不確定的週期的資料。累積快照事實表代表的是完全覆蓋一個事務或產品的生命週期的時間跨度,它通常具有多個日期欄位,用來記錄整個生命週期中的關鍵時間點。例如訂單累計快照事實表會有付款日期,發貨日期,收貨日期等時間點。 事務事實表中一條交易記錄會每天有一條資料來記錄整個交易過程;而累積快照事實表只會有一條記錄,資料會一致更新直到過程結束。 累積快照事實表代表的是完全覆蓋一個事務或產品的生命週期的時間跨度,它通常具有多個日期欄位,用來記錄整個生命週期中的關鍵時間點。另外,它還會有一個用於指示最後更新日期的附加日期欄位。由於事實表中許多日期在首次載入時是不知道的,所以必須使用代理關鍵字來處理未定義的日期,而且這類事實表在資料載入完後,是可以對它進行更新的,來補充隨後知道的日期資訊。 週期快照事實表記錄的是重複的可預測到的時間間隔的事實,例如帳戶月結餘事實表,用來記錄每個月末的帳戶結餘資訊。一般週期快照的資料會按報表需要的週期進行記錄,比較適合週期長一些的情況。 而累計快照適用於較短週期,有著明確的開始和結束狀態的過程,如一個訂單執行的過程,並記錄過程中每個步驟的執行時間,使分析人員對執行的過程有整體的把握。週期快照事實表記錄上每個步驟的執行時間是逐步建立的,隨著執行的過程逐步更新的事實表中。 6.三種事實表的區別