首页/数据/数据工程与 ETL 速查/Data Vault 建模要点

Data Vault 建模要点

Data Vault 用三类表表达企业数据:Hub 存业务键、Link 存实体间关系、Satellite 存描述属性与变更历史;结构可扩展、加载可并行,代价是查询组装复杂,通常再叠加一层星型集市对外服务。

Data Vault 建模要点

Data Vault 用三类表表达企业数据:Hub 存业务键(客户号、订单号),只保留键与加载信息;Link 表达实体之间的关系(订单属于哪个客户);Satellite 存描述属性与变更历史(名称、城市、等级及其生效时间)。它的优势是结构可扩展、加载可并行、插入即可(不更新既有行),适合多源接入与频繁变更的集成场景;代价是查询要写多层连接,对外服务时通常再叠加一层星型集市或宽表。

基本信息

Hub业务键加加载时间与来源,每类实体一个
Link两个或多个 Hub 之间的关系
Satellite描述属性加生效时间,承载变更历史
加载特性以插入为主、可并行,天然保留历史
使用方式作为集成层,对外再建维度模型或宽表

典型使用场景

  • 多源系统整合:同一客户在不同系统有不同编号,需要统一业务键
  • 频繁结构变更:源系统经常新增字段,用 Satellite 扩展而不影响既有结构
  • 审计要求高:需要保留每一次属性变更与来源信息
  • 并行加载:多个批次同时入库而不互相锁等待
  • 迁移过渡:从旧数仓迁移期间作为统一集成层

结构示意

结构示意
-- Hub:只放业务键与加载信息
hub_customer    (customer_hk, customer_id, load_dts, src)

-- Link:表达实体之间关系
link_order_cust (order_hk, customer_hk, load_dts)

-- Satellite:描述属性与生效时间,变更即插入新行
sat_customer    (customer_hk, load_dts, name, city, level)

-- 查询当前属性:取每个键最新的加载时间
SELECT c.customer_id, s.name, s.city, s.level
FROM hub_customer c
JOIN sat_customer s ON c.customer_hk = s.customer_hk
QUALIFY ROW_NUMBER() OVER (PARTITION BY c.customer_hk ORDER BY s.load_dts DESC) = 1;

三类表分工

表类型存什么是否更新常见问题
Hub业务键与来源不更新,只插入业务键清洗规则不统一
Link实体间关系只插入关系重复插入需去重
Satellite描述属性加时间只插入加载时间口径需统一
对外层星型或宽表按需覆盖加工逻辑需可追溯
Data Vault 适合多源接入、频繁变更的企业集成场景;数据量与人手有限时,直接建星型模型更省事,不必为了方法论而增加复杂度。
直接用 Data Vault 表对外提供分析,查询要写多层连接,使用者难以正确取到“当前最新属性”,容易出现口径错误。
Hub 与 Satellite 的加载时间口径不一致时,按时间点回溯会出现空洞:某个时点能查到键却查不到属性,回溯结论不可信。

易错点

  • 直接用 Data Vault 表对外提供分析,查询要写多层连接,使用者取错版本
  • Hub 与 Satellite 加载时间口径不一致,按时间点回溯出现属性空洞
  • Link 表重复插入同一关系且无去重规则,关系行数虚高影响统计
  • 业务键未做清洗统一(大小写、空格、编码差异),同一实体在 Hub 里出现多条

数据来源与参考

  • Dan Linstedt 提出的 Data Vault 建模方法
  • 行业数据仓库建模实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌