資料建模師的核心價值在於深度理解業務語義,建模方法與技巧服務於業務需求;DBA 側重運行維護、效能調優、高可用架構。本文拋開具體業務,聚焦建模方法論、倉庫架構選型、變更資料捕獲(CDC)實戰技巧。
| 類別 | 代表 | 核心特徵 | 適用場景 |
|---|---|---|---|
| 關係範式建模 (3NF) | Codd | 消除冗余、避免異常、單一事實表達 | OLTP 操作型系統、核心業務主檔 |
| Inmon 企業數據倉庫 (EDW) | Bill Inmon | 三層:實體關係層(3NF)→數據項集層(按頻率分層)→物理層 | 企業級統一數據中台、複雜探索分析、數據挖掘 |
| Kimball 維度建模 | Ralph Kimball | 星型/雪花結構、事實表+維度表、面向查詢效能與易懂性 | BI 報表、儀表板、OLAP 立方體、業務自助分析 |
| 數據準備區/暫存區 | - | 不拘泥範式、臨時表、冗欄位、無主鍵、僅供 ETL 使用 | ETL 中間處理、複雜轉換邏輯、大量資料整合清洗 |
準備區不對外服務,僅供 ETL 工程師使用,可大膽犧牲規範換取處理效率:
大表整合/清洗時,建立同結構臨時表,僅載入待處理分區(如特定日期、狀態)。更新/計算在小表完成,最後批次寫回目標表。避免全表掃描與鎖爭用。
案例:客戶表 `{客戶ID, 淨扣值}`,債項表 `{債項ID, 客戶ID, 余額, 淨扣值}`。需按余額比例分攤客戶淨扣值到各債項。
做法:
1. 客戶表加欄位 `客戶余額`(彙總債項余額)
2. 債項表加冗余欄位 `客戶余額, 客戶淨扣值`
3. 三條 SQL 完成:
① `UPDATE 客戶 SET 客戶余額 = (SELECT SUM(余額) FROM 債項 WHERE 客戶ID=...)`
② `UPDATE 債項 SET 客戶余額=客戶.客戶余額, 客戶淨扣值=客戶.淨扣值 FROM 客戶 WHERE 債項.客戶ID=客戶.客戶ID`
③ `UPDATE 債項 SET 淨扣值 = 余額 * 客戶淨扣值 / 客戶余額`
效果:避免複雜子查詢/游標,執行時間從小時級降至分鐘級。
原則:以「滿足 ETL 處理需求、最大化效能、最小化風險」為唯一準則。
| 方法 | 原理 | 優點 | 缺點 |
|---|---|---|---|
| 全表掃描對比 | 快照比對 | 通用、無侵入 | 大表極慢、無法捕獲中間狀態 |
| DBMS 日誌採礦 | 解析 Redo/Archive Log | 完整、無侵入、標準化 | 解析複雜、供應商鎖定 |
| 觸發器 | DML 觸發寫入變更表 | 即時、邏輯可控 | 源系統效能影響大、需高權限 |
| 時間戳/版本號 | 查詢 `WHERE last_modified > :last_run` | 簡單、低耦合 | 無法捕獲刪除、時鐘漂移、批次更新同時間戳 |
| 複製技術 | GoldenGate/Data Guard/邏輯複製 | 高可用、異構同步 | 成本高、架構複雜 |
| DBMS 內建 CDC | Oracle CDC / SQL Server CDC / PostgreSQL Logical Decoding | 原生支援、標準化、低維護 | 版本依賴、功能差異大 |
場景:零售合同表,主鍵 = `供貨單位編號 + 合同號`(智能組合鍵)。任一屬性變更導致主鍵變更,CDC 難以關聯新舊記錄。
合同捕獲表:`原主鍵, 新主鍵, 變更類型, 變更時間, 其他欄位...`DELETE 觸發器:插入捕獲表,`新主鍵=NULL` 表示刪除UPDATE 觸發器:插入捕獲表,比對 `原主鍵` vs `新主鍵` 判斷主鍵是否變更缺點:侵入源系統、觸發器效能開銷、維護複雜。非萬不得已不建議。
遵循上述原則,CDC 可簡化為「查詢 `UPDATED_AT > :last_run`」或「讀取內建 CDC 日誌」,完全規避主鍵變更噩夢。
DBMS_CDC_PUBLISH/SUBSCRIBE、XStreamChange Data Capture / Change TrackingLogical Decoding + pgoutput/wal2jsonBinlog GTID + Canal/Debezium 生態複雜的底層技術交給資料庫廠商,應用層專注於業務語義映射、資料品質、下游消費,才是數據工程的正確分工。