iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0

事實表

事實表(Fact Table) 主要儲存與業務流程相關的指標或是量化數值,例如銷售金額、訂單數量等,事實表的設計對於OLAP的效能和分析彈性非常關鍵,有一個非常核心的設計重點:『完全依賴現實世界的實際事件活動,不受可能產生的報表或是分析影響』,接著我們來針對事實表設計深入介紹,包括結構、類型和一些設計上要注意的事情:

案例-數位學習平台

後面的說明我們會用數位學習平台作為案例輔助:

在數位學習平台上,學生會不定時的收到作業,並且自己可以在任意的時間開始做作業,
開始以後系統會讓學生依序作答每一個題目,直到答對所有題目,就能按下完成作業送出,
系統會自動做批改、計算得分。

事實表的組成部分

一個典型的事實表通常由以下幾種欄位主要組成:

  1. 度量值 (measures/metrics):(雖然我沒有很喜歡度量值這個詞,但我暫時找不到更好的用詞QQ )
  • 定義:是事實表的核心內容,通常是數值或指標,例如銷售金額、訂單數量、成本、收入等。
  • 特點:
    • 可累加,可以進行彙總、計算平均值、最大值或最小值等操作。
    • 度量值通常來自業務事件(如一次銷售、一筆交易),代表具體的業務活動。
  1. 外部鍵(Foreign Keys):
  • 定義:事實表中的外部鍵用來參照維度表,這些外部鍵指向相關的維度表,用於提供度量值的情境與彙總。
  • 特點:
    • 通常包含『產品』、『業務』的分析維度
    • 外部鍵提供分析時,分類、篩選和彙總數據的能力,像是依據時間、地點、產品等維度進行分析
  1. 時間或日期(Timestamps/Date Keys):
  • 定義:事實表通常包含與時間相關的外部鍵或日期資料,用來記錄業務事件發生的時間點
  • 特點:
    • 時間維度是數據分析中最常用的維度之一,可以用年、季、月、日,甚至更精細的時間顆粒來進行資料切片(Slicing)
    • 用於進行趨勢分析和歷史數據比較

https://ithelp.ithome.com.tw/upload/images/20240926/20114297dtmYMeJ5Ov.png

事實表的類型

事實表根據其記錄的業務事件和資料的性質,通常分為以下三種類型:

  1. 交易型事實表(Transactional Fact Table):
  • 定義:記錄每個業務事件或現實世界活動的詳細資料,例如一次銷售、一筆銀行交易或一次訂單
  • 特點:
    • 每筆資料代表一次具體的業務活動或事件
    • 例子:
      • 每筆訂單的詳細資訊,包括產品、銷售金額、日期和客戶
      • 每位學生每份作業的繳交狀況

https://ithelp.ithome.com.tw/upload/images/20240926/20114297IfLlM9yy5u.png

  1. 快照型事實表(Snapshot Fact Table):
  • 定義:記錄某個時間點的業務狀態或彙總資訊,通常用於跟蹤長期的業務變化
  • 特點:
    • 每個時間點記錄當時的狀態數據,例如當天的活躍人數、月底的訂閱人數
    • 適合進行趨勢分析,分析隨時間變化的模式
    • 例子:
      • 目前商品的庫存數量
      • 目前作業的完成人數,每天定時去做一次統計並儲存當前完成的人數

https://ithelp.ithome.com.tw/upload/images/20240926/20114297DvnfE1d1TD.png

  1. 累積型事實表(Accumulating Snapshot Fact Table):
  • 定義:記錄一個業務流程的整個生命周期,包含了業務事件的多個階段,並隨著業務進展更新記錄
  • 特點:
    • 每個業務流程的不同階段都在同一筆資料上進行更新,而不是每次都創建新記錄
    • 適合追蹤長期的業務變化過程,例如訂單處理流程或客戶技術支援需求的解決進度
  • 例子:
    • 跟蹤訂單從下單到發貨再到付款的整個過程
    • 學生作業完成狀況的時間追蹤,依據不同的階段都紀錄階段發生的時間,方便追蹤狀況

https://ithelp.ithome.com.tw/upload/images/20240926/20114297hRuvEdLUHm.png

事實表的設計的注意事項

設計事實表時,需考慮查詢效率、分析彈性以及可擴展性:

  1. 選擇適當的度量值:度量值是與業務過程直接相關的可量化數據,確保其具備統計意義(平均、加總),以便進行後續的數據分析。
  2. 外部鍵: 外部鍵不應包含過多的空值(null),以免影響查詢性能和數據的完整性。
  3. 保持事實表的稀疏性:事實表要盡量避免存太多在某些業務流程中沒有意義的資料。
  4. 選擇適當的粒度:粒度(granularity)是事實表中每一筆資料的最細粒度的業務事件或過程,粒度越細,事實表越大,但能提供更詳細的分析彈性,粒度過粗會導致無法進行細緻的分析,彈性變小。
  5. 考慮時間維度:時間是最常被使用的維度,大部分業務活動都是與時間相關的,應確保時間維度能夠靈活地支援各種時間範圍的查詢,例如日、周、月、季度或年度。
  6. 避免事實表的過度正規化: 過度的正規化會導致查詢時需要進行過多的JOIN,從而降低查詢效率,也不便於數據使用者理解,事實表中的度量值應該盡量簡潔且直接,避免重複數據。
  7. 避免蜈蚣事實表:有些設計會把有相依性的維度拆開成不同維度表,導致一張事實表上有過多的外部鍵,這類型的設計應該要回到最細的粒度去設計事實表,例如:把『年』、『月』、『日』分成三張維度表,在事實表上同時有這三個外部鍵

總結

事實表是OLAP中的核心元素,通過合理設計事實表的度量值、外部鍵和時間維度,並選擇合適的粒度,你就能有效地幫助產品和業務達成資料查詢和報告的目標。同時,從資料工程的角度,你應該持續保持事實表的簡潔,並考慮資料品質和擴展性,以應對未來的需求和挑戰。


上一篇
OLAP 維度建模(一):打造分析準備好的資料倉儲
系列文
資料決策時代:從零開始打造公司數據引擎與決策文化12
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言