先定義要回答的歷史問題
企業資料平台常把客戶、產品、門市、業務人員與組織單位建成維度資料。這些資料會變動:客戶可能更換產業分類,產品可能調整品類,員工也可能轉調部門。若資料表只保留目前值,去年發生的訂單便會被新的部門或品類重新解讀。結果不是資料遺失,而是同一份歷史報表在不同時間執行時得到不同答案。
設計前應先確認查詢需要哪一種時間視角。目前視角是用最新組織架構重新檢視所有交易;事件視角是呈現交易發生當下的維度狀態;系統認知視角則回答某一天的系統當時知道什麼。一般管理報表多半需要前兩種,稽核、資料更正或延遲到件的情境才可能需要第三種。若沒有先釐清,團隊很容易建立複雜的版本表,卻仍無法回答真正的業務問題。
用版本化維度保留有效期間
最常見的做法是緩慢變動維度第二型,也就是維度每次發生需要追蹤的變更時,不覆寫舊列,而是關閉舊版本並新增一列。每個版本應有獨立的代理鍵,以及業務鍵、有效起日、有效迄日與目前版本標記。事實表連到代理鍵,才能固定指向交易當時使用的維度版本;若只連客戶編號或產品編號,查詢仍可能誤接到最新資料。
- 先選擇追蹤欄位:部門、產品品類、客戶分群等會影響分析解讀的欄位通常值得版本化;拼字修正或非分析欄位不一定需要新增版本。
- 統一時間邊界:建議採半開區間,也就是有效起日包含、有效迄日不包含,避免午夜交界出現重疊或空隙。
- 建立不可重疊約束:同一業務鍵在任何時間點只能有一個有效版本,載入程序也應檢查重複與反向區間。
- 預留未知版本:當事實資料早於維度到達時,先連到明確的未知成員,不要使用空值或任意抓最新版本。
不是所有欄位都要採第二型。若報表只在意最新電話或聯絡信箱,直接更新通常較合理;若需要同時保留舊值與新值,也可以在同一列保存有限的前值。實務上常見的是混合策略:少數具有分析意義的屬性版本化,其餘屬性覆寫。這能控制資料量,也降低使用者誤選欄位的機會。
處理延遲資料、回溯修正與雙時間
真正棘手的情況通常不是正常的每日更新,而是延遲到達與回溯修正。例如組織異動在月底才送進資料平台,但實際生效日是月中。此時不能只把新版本從載入日開始生效,而應依業務生效時間切割既有區間,必要時重新指派受影響期間的事實資料。更新前要先辨識區間重疊、同時生效的多筆來源,以及來源系統無法提供精確時間時的優先規則。
若系統還需要回答資料何時被平台得知,單一有效期間就不夠。可以加入業務有效時間與系統記錄時間,形成雙時間模型。前者描述現實世界何時成立,後者描述平台何時收到或修正資料。這種模型有助於稽核與重現舊報表,但查詢、ETL 與資料治理成本都更高。沒有明確需求時,不必一開始就全面採用;可先在合約、價格、權限或法遵敏感資料上導入。
讓歷史模型能被正確使用與驗證
好的版本模型仍可能被錯誤查詢。資料倉儲應提供清楚命名的檢視表或語意層,例如目前客戶、交易時點客戶與指定日期客戶,避免每位分析人員自行撰寫時間區間連接。事實載入時應以事件時間尋找維度版本,並記錄找不到版本、匹配到多個版本或使用未知成員的情況。若資料會被重新處理,流程還必須具備冪等性,避免重跑後產生重複版本。
驗證時不要只比較資料筆數。更重要的是檢查同一業務鍵的有效期間是否連續且不重疊、目前版本是否唯一、事實資料是否落在所連版本的有效區間,以及回溯修正後既有月報能否依預期重現。最後,將時間語意、時區、來源優先順序與更正政策寫進資料契約。若 ERP、CRM、LINE 服務或 IoT 平台各自使用不同時間精度,整合團隊也應在進倉前統一規則,否則再完整的歷史模型也只會保存彼此矛盾的版本。服務報表與管理報表若有不同的重述政策,則應分別標示,讓使用者知道看到的是原始歷史、已更正歷史,還是依目前分類重算的結果。