每個(gè)數(shù)據(jù)倉(cāng)庫(kù)都包含一個(gè)或者多個(gè)事實(shí)數(shù)據(jù)表。其中可能包含業(yè)務(wù)銷售數(shù)據(jù),如現(xiàn)金登記事務(wù)所產(chǎn)生的數(shù)據(jù),通常包含大量的行。事實(shí)數(shù)據(jù)表的主要特點(diǎn)是包含數(shù)字?jǐn)?shù)據(jù)(事實(shí)),并且這些數(shù)字信息可以匯總,以提供有關(guān)單位作為歷史的數(shù)據(jù),每個(gè)事實(shí)數(shù)據(jù)表包含一個(gè)由多個(gè)部分組成的索引,該索引包含作為外鍵的相關(guān)性維度表的主鍵,而維度表包含事實(shí)記錄的特性。
一、事實(shí)表基礎(chǔ)
1. 事實(shí)表特征
事實(shí)表作為數(shù)倉(cāng)維度建模的核心,緊緊圍繞著業(yè)務(wù)過(guò)程來(lái)設(shè)計(jì),通過(guò)獲取描述業(yè)務(wù)過(guò)程的度量來(lái)表達(dá)業(yè)務(wù)過(guò)程,包含了引用的維度和業(yè)務(wù)過(guò)程有關(guān)的度量。事實(shí)表中一條記錄所表達(dá)的業(yè)務(wù)細(xì)節(jié)程度被稱為粒度(業(yè)務(wù)中的細(xì)節(jié)程度)。通常粒度可以通過(guò)兩種方式來(lái)表達(dá):一種是維度屬性組合所表示的細(xì)節(jié)程度,另一種是所表示的具體業(yè)務(wù)含義。
作為度量業(yè)務(wù)過(guò)程的事實(shí)(事實(shí)表屬性),一般為整型或浮點(diǎn)型的十進(jìn)制數(shù)值,有可加性、半可加性和不可加性三種類型:
可加性事實(shí) 是指可以按照與事實(shí)表關(guān)聯(lián)的任意維度進(jìn)行匯總。
半可加性事實(shí) 只能按照特定維度匯總,不能對(duì)所有維度匯總,比如庫(kù)存可以按照地點(diǎn)和商品進(jìn)行匯總,而按時(shí)第門章事實(shí)表設(shè)計(jì)丁一間維度把一年中每個(gè)月的庫(kù)存累 加起來(lái)則毫無(wú)意義。
不可加事實(shí) 不具備可加性,比如比率型事實(shí)。對(duì)于不可加性事實(shí)可分解為可加的組件來(lái)實(shí)現(xiàn)聚集。
2. 有事實(shí)的事實(shí)表
有事實(shí)表分為三種類型 :事務(wù)事實(shí)表、周期快照事實(shí)表和累積快照事實(shí)表。

3. 無(wú)事實(shí)的事實(shí)表
無(wú)事實(shí)的事實(shí)表可以用來(lái)跟蹤事件的發(fā)生。例如,在給定的某一天中發(fā)生的學(xué)生參加課程的事件,可能沒(méi)有可記錄的數(shù)字化事實(shí),但該事實(shí)行帶有一個(gè)包含日期、學(xué)生、教師、地點(diǎn)、課程等定義良好的外鍵。利用無(wú)事實(shí)的事實(shí)表可以按各種維度計(jì)數(shù)上課這個(gè)事件。

二、事實(shí)表設(shè)計(jì)原則
-
盡可能包含所有與業(yè)務(wù)過(guò)程相關(guān)的事實(shí);
-
只選擇與業(yè)務(wù)過(guò)程相關(guān)的事實(shí);
-
分解不可加性事實(shí)為可加的組件;比如訂單的優(yōu)惠率,應(yīng)該分解為訂單原價(jià)金額與訂單優(yōu)惠金額
-
在選擇維度和事實(shí)之前必須先聲明粒度;
-
在同一個(gè)事實(shí)表中不能有多種不同粒度的事實(shí);粒度的聲明是事實(shí)表設(shè)計(jì)中不可忽視的重要一步,粒度用于確定事實(shí)表中一行所表示業(yè)務(wù)的細(xì)節(jié)層次,決定了維度模型的擴(kuò)展性,在選擇維度和事實(shí)之前必須先聲明粒度,且每個(gè)維度和事實(shí)必須與所定義的粒度保持一致
-
在同一個(gè)事實(shí)表中不能有多種不同粒度的事實(shí);
-
事實(shí)的單位要保持一致;
-
對(duì)事實(shí)的 null 值要處理;在數(shù)據(jù)庫(kù)中null值對(duì)常用的大于或小于等SQL不生效,建議使用零值填充
-
使用退化維度提高事實(shí)表的易用性;目的主要是為了減少下游用戶使用時(shí)關(guān)聯(lián)多個(gè)表的操作。直接通過(guò)退化維度實(shí)現(xiàn)對(duì)事實(shí)表的過(guò)濾查詢、控制聚合層次、排序數(shù)據(jù)以及定義主從關(guān)系等
三、事實(shí)表設(shè)計(jì)方法
Kimball的四步維度建模方法:選擇業(yè)務(wù)過(guò)程、聲明粒度、確定維度、確定事實(shí)。
Step 1:選擇業(yè)務(wù)過(guò)程及確定事實(shí)表類型。
在明確了業(yè)務(wù)需求以后,接下來(lái)需要進(jìn)行詳細(xì)的需求分析,對(duì)業(yè)務(wù)的整個(gè)生命周期進(jìn)行分析,明確關(guān)鍵的業(yè)務(wù)步驟,從而選擇與需求有關(guān)的業(yè)務(wù)過(guò)程。(業(yè)務(wù)過(guò)程通常使用行為動(dòng)詞表示業(yè)務(wù)執(zhí)行的活動(dòng))
Step 2:聲明粒度。
粒度的聲明是事實(shí)表建模非常重要的一步,意味著精確定義事實(shí)表的每一行所表示的業(yè)務(wù)含義,粒度傳遞的是與事實(shí)表度量有關(guān)的細(xì)節(jié)層次。明確的粒度能確保對(duì)事實(shí)表中行的意思的理解不會(huì)產(chǎn)生混淆,保證所有的事實(shí)按照同樣的細(xì)節(jié)層次記錄。
Step 3:確定維度。
完成粒度聲明以后,也就意味著確定了主鍵,對(duì)應(yīng)的維度組合以及相關(guān)的維度字段就可以確定了,應(yīng)該選擇能夠描述清楚業(yè)務(wù)過(guò)程所處的環(huán)境的維度信息。
Step 4:確定事實(shí)。
事實(shí)可以通過(guò)回答“過(guò)程的度量是什么”來(lái)確定。應(yīng)該選擇與業(yè)務(wù)過(guò)程有關(guān)的所有事實(shí),且事實(shí)的粒度要與所聲明的事實(shí)表的粒度一致。事實(shí)有可加性、半可加性、非可加性三種類型 , 需要將不可加性事實(shí)分解為可加的組件。
Step 5:冗余維度。
冗余維度是在kimball維度建模方法基礎(chǔ)上新增的步驟。主要是因?yàn)樵诖髷?shù)據(jù)的事實(shí)表模型設(shè)計(jì)中,需要考慮更多的是提高下游用戶的使用效率,降低數(shù)據(jù)獲取的復(fù)雜性,減少關(guān)聯(lián)的表數(shù)量。所以通常事實(shí)表中會(huì)冗余方便下游用戶使用的常用維度,以實(shí)現(xiàn)對(duì)事實(shí)表的過(guò)濾查詢、控制聚合層次、排序數(shù)據(jù)以及定義主從關(guān)系等操作。
四、有事實(shí)的事實(shí)表
有事實(shí)表分為三種類型 :事務(wù)事實(shí)表、周期快照事實(shí)表和累積快照事實(shí)表。
1. 事務(wù)事實(shí)表
單事務(wù)事實(shí)表
針對(duì)于每個(gè)業(yè)務(wù)過(guò)程設(shè)計(jì)一個(gè)事實(shí)表,方便每個(gè)業(yè)務(wù)過(guò)程進(jìn)行獨(dú)立分析研究。
優(yōu)點(diǎn):更方便跟蹤業(yè)務(wù)流程細(xì)節(jié)數(shù)據(jù),針對(duì)特殊的業(yè)務(wù)分析場(chǎng)景比較方便和靈活,數(shù)據(jù)處理上也更加靈活;
弊端:數(shù)倉(cāng)中需要管理太多的事實(shí)表,同時(shí)跟蹤業(yè)務(wù)流轉(zhuǎn)不夠直觀
多事務(wù)事實(shí)表
多事務(wù)事實(shí)表,將不同的事實(shí)放到同一個(gè)事實(shí)表中,即同一個(gè)事實(shí)表包含不同的業(yè)務(wù)過(guò)程。多事務(wù)事實(shí)表在設(shè)計(jì)時(shí)有兩種方法進(jìn)行事實(shí)的處理:
一是不同業(yè)務(wù)過(guò)程的事實(shí)使用不同的事實(shí)字段進(jìn)行存放:
二是不同業(yè)務(wù)過(guò)程的事實(shí)使用同一個(gè)事實(shí)字段進(jìn)行存放,但增加一個(gè)業(yè)務(wù)過(guò)程標(biāo)簽。
優(yōu)點(diǎn):能夠更直觀的跟蹤業(yè)務(wù)流轉(zhuǎn)和當(dāng)前狀態(tài),流程事實(shí)集中,方便大部分的通用分析應(yīng)用場(chǎng)景,由于和業(yè)務(wù)側(cè)的數(shù)據(jù)模型設(shè)計(jì)思路一致,也是目前最常用的事實(shí)表設(shè)計(jì);
弊端:細(xì)節(jié)數(shù)據(jù)跟蹤不到位,特殊場(chǎng)景的分析不夠靈活;

兩種表的設(shè)計(jì)區(qū)別在于對(duì)業(yè)務(wù)流程的拆分思路不同,具體選擇事實(shí)表的構(gòu)建思路,需要根據(jù)實(shí)際的業(yè)務(wù)確定,一般建議兩者結(jié)合
父子事實(shí)的處理方式:
通過(guò)分?jǐn)偢赣唵蔚慕痤~將所有業(yè)務(wù)過(guò)程的度量全部帶進(jìn)淘寶交易事務(wù)事實(shí)表中,包括下單數(shù)量、商品價(jià)格、子訂單折扣、下單分?jǐn)偙壤⒏赣唵沃Ц督痤~、父訂單支付郵費(fèi)、父訂單折扣、子訂單下單金額、子訂單下單有效金額、支付分?jǐn)偙壤⒆佑唵沃Ц督痤~等,將父子事實(shí)同時(shí)冗余到事務(wù)表中。
設(shè)計(jì)準(zhǔn)則:
事實(shí)完整性
事實(shí)表包含與其描述的過(guò)程有關(guān)的所有事實(shí),即盡可能多地獲取所有的度量。
事實(shí)一致性
在確定事務(wù)事實(shí)表的事實(shí)時(shí),明確存儲(chǔ)每一個(gè)事實(shí)以確保度量的一致性。
事實(shí)可加性
事實(shí)表確定事實(shí)時(shí),往往會(huì)遇到非可加性度量,比如分?jǐn)偙壤⒗麧?rùn)率等,雖然它們也是下游分析的關(guān)鍵點(diǎn),但往往在事務(wù)事實(shí)表中關(guān)注更多的是可加性事實(shí),下游用戶在聚合統(tǒng)計(jì)時(shí)更加方便。
2. 周期快照事實(shí)表
快照事實(shí)表在確定的問(wèn)隔內(nèi)對(duì)實(shí)體的度量進(jìn)行抽樣,這樣可以很容易地研究實(shí)體的度量值,而不需要聚集長(zhǎng)期 的事務(wù)歷史。
特征:
用快照采樣狀態(tài)
快照事實(shí)表以預(yù)定的間隔采樣狀態(tài)度量。這種間隔聯(lián)合一個(gè)或多個(gè)維度,將被用來(lái)定義快照事實(shí)表的粒度,每行都將包含記錄所涉及狀態(tài)的事實(shí)。
快照粒度
事務(wù)事實(shí)表的粒度可以通過(guò)業(yè)務(wù)過(guò)程中所涉及的細(xì)節(jié)程度來(lái)描述,但快照事實(shí)表的粒度通常總是被多維聲明,可以簡(jiǎn)單地理解為快照需要采樣的周期以及什么將被采樣。
密度與稀疏性
快照事實(shí)表和事務(wù)事實(shí)表的一個(gè)關(guān)鍵區(qū)別在密度上。事務(wù)事實(shí)表是稀疏的,只有當(dāng)天發(fā)生的業(yè)務(wù)過(guò)程,事實(shí)表才會(huì)記錄該業(yè)務(wù)過(guò)程的事實(shí),如下單、支付等;而快照事實(shí)表是稠密的,無(wú)論當(dāng)天是否有業(yè)務(wù)過(guò)程發(fā)生,都會(huì)記錄一行,比如針對(duì)賣家的歷史至今的下單和支付金額,無(wú)論當(dāng)天賣家是否有下單支付事實(shí),都會(huì)給該賣家記錄一行。
半可加性
在快照事實(shí)表中收集到的狀態(tài)度量都是半可加的。與事務(wù)事實(shí)表的可加性事實(shí)不同,半可加性事實(shí)不能根據(jù)時(shí)間維度獲得有意義的匯總結(jié)果。
設(shè)計(jì)實(shí)例:
單維度的每天快照事實(shí)表
確定粒度、確定維度
混合維度的每天快照事實(shí)表
確定粒度、確定維度、確定狀態(tài)度量
全量快照事實(shí)表
相比單維度的快照事實(shí)表,多了一些冗余維度。例如,商品評(píng)價(jià)表,多了子訂單維度、商品維度、評(píng)論者維度。
3. 累計(jì)快照事實(shí)表
對(duì)于類似于研究事件之間時(shí)間間隔的需求,采用累計(jì)快照事實(shí)表可以很好地解決。
如在統(tǒng)計(jì)買家下單到支付的時(shí)長(zhǎng)、買家支付到賣家發(fā)貨的時(shí)長(zhǎng)等,事務(wù)事實(shí)表很難滿足,需要用到累計(jì)快照事實(shí)表。
特征:
數(shù)據(jù)不斷更新
針對(duì)于實(shí)體中的某一實(shí)例定期更新。
多業(yè)務(wù)過(guò)程日期
累積快照事實(shí)表適用于具有較明確起止時(shí)間的短生命周期的實(shí)體,比如交易訂單、物流訂單等,對(duì)于實(shí)體的每一個(gè)實(shí)例,都會(huì)經(jīng)歷從誕生到消亡等一系列步驟。對(duì)于商品、用戶等具有長(zhǎng)生命周期的實(shí)體,一般采用周期快照事實(shí)表更合適。累積快照事實(shí)表的典型特征是多業(yè)務(wù)過(guò)程日期,用于計(jì)算業(yè)務(wù)過(guò)程之間的時(shí)間間隔。但結(jié)合阿里巴巴數(shù)據(jù)倉(cāng)庫(kù)模型建設(shè)的經(jīng)驗(yàn),對(duì)于累積快照事實(shí)表,還有一個(gè)重要作用是保存全量數(shù)據(jù)。
特殊處理:
非線性過(guò)程
淘寶一般流程是:下單、支付、發(fā)貨、確認(rèn)收貨。但并不是所有的交易都會(huì)走此流程,比如買家下單之后不支付或關(guān)閉訂單。針對(duì)這種非線性過(guò)程,處理情況主要有以下幾種:
(1)業(yè)務(wù)過(guò)程的統(tǒng)一
我們以流程結(jié)束標(biāo)志為依據(jù),關(guān)閉訂單也是結(jié)束標(biāo)志,統(tǒng)一起來(lái)。
(2)針對(duì)業(yè)務(wù)關(guān)鍵里程碑構(gòu)建全面的流程
對(duì)于沒(méi)有支付或沒(méi)有發(fā)貨的交易訂單也將其納入流程來(lái),相關(guān)的業(yè)務(wù)字段置孔。
(3)循環(huán)流程的處理
主要解決問(wèn)題是一個(gè)業(yè)務(wù)過(guò)程有多個(gè)日期。使用業(yè)務(wù)過(guò)程的第一次發(fā)生日期還是最近發(fā)生日期,根據(jù)用戶決定。
多源過(guò)程
針對(duì)多源業(yè)務(wù)建模,主要考慮事實(shí)表的粒度問(wèn)題。
業(yè)務(wù)過(guò)程取舍
當(dāng)擁有大量的業(yè)務(wù)過(guò)程時(shí),模型的實(shí)現(xiàn)復(fù)雜度會(huì)增加,特別是對(duì)于多源業(yè)務(wù)過(guò)程,模型的精合度過(guò)高,此時(shí)需要根據(jù)商業(yè)用戶需求,選取關(guān)鍵的里程碑。
物理實(shí)現(xiàn):
邏輯模型和物理模型密不可分,針對(duì)累積快照事實(shí)表模型設(shè)計(jì),其有不同的實(shí)現(xiàn)方式。
第一種:增量存儲(chǔ) 以業(yè)務(wù)實(shí)體的結(jié)束時(shí)間分區(qū)。即每周期僅處理增量部分的數(shù)據(jù),針對(duì)狀態(tài)無(wú)變化的數(shù)據(jù)比較適合
第二種:全量快照 狀態(tài)有變化,每天的分區(qū)存儲(chǔ)昨天的全量數(shù)據(jù)和當(dāng)天的增量數(shù)據(jù)合并的結(jié)果,對(duì)于數(shù)據(jù)量在可控范圍內(nèi)的情況可以采用如下 保存策略: 如果存儲(chǔ)空間和成本可接受,完整存儲(chǔ),確保能夠追溯到歷史每天數(shù)據(jù)狀態(tài) 存儲(chǔ)空間有限,考慮移動(dòng)歷史快照數(shù)據(jù)到冷盤,需要使用的時(shí)候可恢復(fù) 數(shù)據(jù)歷史狀態(tài)數(shù)據(jù)無(wú)太大價(jià)值,可以考慮部分刪除,比如近保留每月最后一天的快照數(shù)據(jù)
第三種:拉鏈 針對(duì)于全量表的變化形式,數(shù)據(jù)量大、但緩慢變化、需要跟蹤歷史狀態(tài),和緩慢漸變維類似。
設(shè)計(jì)準(zhǔn)則:
同事務(wù)事實(shí)表設(shè)計(jì)一樣。
五、無(wú)事實(shí)的事實(shí)表

在維度模型中,事實(shí)表用事實(shí)來(lái)度量業(yè)務(wù)過(guò)程,不包含事實(shí)或度量的事實(shí)表稱為無(wú)事實(shí)的事實(shí)表。雖然沒(méi)有明確的事實(shí),但可以用來(lái)支持業(yè)務(wù)過(guò)程的度量。常見(jiàn)的無(wú)事實(shí)的事實(shí)表主要有如下兩種:第一種是事件類的,記錄事件的發(fā)生。
如阿里巴巴數(shù)據(jù)倉(cāng)庫(kù)中,最常見(jiàn)的是日志類事實(shí)表。
第二種是條件、范圍或資格類的,記錄維度與維度多對(duì)多之 間的關(guān)系。
如客戶和銷售人員的分配情況、產(chǎn)品的促銷范圍等。
六、聚集型事實(shí)表
數(shù)據(jù)倉(cāng)庫(kù)的性能是數(shù)據(jù)倉(cāng)庫(kù)建設(shè)是否成功的重要標(biāo)準(zhǔn)之一。聚集主要是通過(guò)匯總明細(xì)粒度數(shù)據(jù)來(lái)獲得改進(jìn)查詢性能的效果。通過(guò)訪問(wèn)聚集數(shù)據(jù),可以減少數(shù)據(jù)庫(kù)在響應(yīng)查詢時(shí)必須執(zhí)行的工作量,能夠快速響應(yīng)用戶的查詢,同時(shí)有利于減少不同用戶訪問(wèn)明細(xì)數(shù)據(jù)帶來(lái)的結(jié)果不一致問(wèn)題。如阿里巴巴將使用頻繁的公用數(shù)據(jù),通過(guò)聚集進(jìn)行沉淀,比如賣家最近 l 天的交易匯總表、賣家最近 N 天的交易匯總表、賣家自然年交易匯總表等。這類聚集匯總數(shù)據(jù),被叫作公共匯總層。
相對(duì)于明細(xì)事實(shí)表,聚合事實(shí)表通常是在明細(xì)事實(shí)表的基礎(chǔ)上,按照一定的粒度粗細(xì)進(jìn)行的匯總、聚合操作,它的粒度較明細(xì)數(shù)據(jù)粒度粗,同時(shí)伴隨著細(xì)節(jié)信息的丟失;在數(shù)倉(cāng)層次結(jié)構(gòu)中,通常位于dws層,一般作為通用匯總數(shù)據(jù)存在,也可以是更高粒度的指標(biāo)數(shù)據(jù)。
1. 基本原則
一致性 聚集表必須提供與查詢明細(xì)粒度數(shù)據(jù)一致的查詢結(jié)果。
避免單一表設(shè)計(jì) 不要在同一個(gè)表中存儲(chǔ)不同層次的聚集數(shù)據(jù);否則將會(huì)導(dǎo)致雙重計(jì)算或出現(xiàn)更糟糕的事情。
聚集粒度可不同 聚集并不需要保持與原始明細(xì)粒度數(shù)據(jù)一樣的粒度,聚集只關(guān)心所需要查詢的維度。
2. 基本步驟
Step 1:確定聚集維度。
Step 2:確定一致性上鉆。
Step 3:確定聚集事實(shí)。
常見(jiàn)聚集型事實(shí)表
數(shù)據(jù)倉(cāng)庫(kù)中,按照日期范圍的不同,通常包括以下類別的聚集事實(shí)表
公共維度層-通用匯總
應(yīng)對(duì)大部分可預(yù)期的、常規(guī)的數(shù)據(jù)需求,通常針對(duì)模式相對(duì)穩(wěn)定的分析、BI指標(biāo)計(jì)算、特征提取等場(chǎng)景,封裝部分業(yè)務(wù)處理、計(jì)算邏輯,盡量避免用戶直接使用底層明細(xì)數(shù)據(jù),該層用到的數(shù)據(jù)范圍比較廣泛。
日粒度
主要應(yīng)對(duì)模式穩(wěn)定的分析、BI日?qǐng)?bào)、特征提取場(chǎng)景,同時(shí)日粒度也為后續(xù)累積計(jì)算提供粗粒度的底層,數(shù)據(jù)范圍一般為上一日的數(shù)據(jù) 。
周期性累積
主要應(yīng)對(duì)明確的周期性分析、BI周期性報(bào)表,數(shù)據(jù)范圍一般在某周期內(nèi)的。
歷史累積
顧名思義,歷史以來(lái)某一特定數(shù)據(jù)的累積,通常在用戶畫像、經(jīng)營(yíng)分析、特征提取方面場(chǎng)景較多,設(shè)計(jì)數(shù)據(jù)范圍比較廣泛,通常是計(jì)算耗時(shí)較長(zhǎng)的一部分,比如某門店累積營(yíng)業(yè)額、某用戶累積利潤(rùn)貢獻(xiàn)、用戶首次下單時(shí)間(非可度量、描述性)。
3. 聚集補(bǔ)充說(shuō)明
聚集是不跨越事實(shí)的
聚集是針對(duì)原始星形模型進(jìn)行的匯總,為了獲取和查詢與原始模型一致的結(jié)果,聚集的維度和度量必須與原始模型保持一致,因 此聚集是不跨越事實(shí)的。
聚集帶來(lái)的問(wèn)題
聚集會(huì)帶來(lái)查詢性能的提升,但聚集也會(huì)增加 ETL 維護(hù)的難度。當(dāng)子類目對(duì)應(yīng)的一級(jí)類目發(fā)生變更時(shí),先前存在的、已經(jīng)被匯總到聚集表中的數(shù)據(jù)需要被重新調(diào)整。這一額外工作隨著業(yè)務(wù)復(fù)雜性的增加,會(huì)導(dǎo)致多數(shù) ETL 人員選擇簡(jiǎn)單強(qiáng)力的方法,刪除并重新聚集數(shù)據(jù)。
(部分內(nèi)容來(lái)源網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除)