Data Vault 是一种 数据建模方法论,主要用于 企业数据仓库(Enterprise Data Warehouse, EDW) 的建模。它由 Dan Linstedt 于 2000 年提出,目的是应对传统维度建模在处理 大规模、复杂、多变数据 时的不足,尤其适用于 历史数据追踪、数据整合与审计需求高 的场景。
一、Data Vault 的核心概念
Data Vault 模型由三种主要表构成:
表类型 | 作用 | 主要特征 |
---|---|---|
Hub 表(中心表) | 存储业务主键(如客户ID、订单ID) | 只包含自然主键和加载时间戳 |
Link 表(链接表) | 表示 Hub 之间的关系(如客户下的订单) | 引用多个 Hub 的主键,表示关联关系 |
Satellite 表(卫星表) | 存储业务属性和历史变化信息 | 与 Hub 或 Link 相关联,包含详细字段和时间戳 |
举例说明:
假设我们有客户(Customer)和订单(Order):
-
Hub_Customer:客户ID(主键)、加载时间
-
Hub_Order:订单ID(主键)、加载时间
-
Link_Customer_Order:客户ID、订单ID、加载时间
-
Sat_Customer_Details:客户姓名、地址、状态、开始时间、结束时间
-
Sat_Order_Details:订单金额、状态、下单时间等
二、Data Vault 的优势
优势 | 说明 |
---|---|
可扩展性(Scalability) | 模型高度标准化,适合海量数据 |
可追溯性(Auditability) | 所有数据都有来源和时间戳,方便审计 |
历史数据保留(Historical Tracking) | 卫星表可记录字段级别的历史变更 |
灵活性(Flexibility) | 可轻松添加新的数据源或属性 |
并行加载(Parallel Loading) | Hub、Link、Satellite 可分别并行加载,提升性能 |
三、与其他建模方法对比
特点 | 维度建模(Kimball) | 第三范式建模(Inmon) | Data Vault |
---|---|---|---|
设计目标 | 报表查询优化 | 企业数据整合 | 历史记录与审计 |
建模难度 | 中等 | 高 | 高 |
灵活性 | 一般 | 高 | 很高 |
可扩展性 | 一般 | 一般 | 很高 |
数据加载复杂度 | 低 | 中 | 高(但支持并行) |
四、应用场景
-
金融、电信、保险等对数据审计要求高的行业
-
多数据源整合、数据频繁变更的场景
-
数据仓库建设初期希望快速迭代,后期逐步完善建模的项目
五、建模注意事项
-
所有表必须有时间戳和来源信息
-
不允许在 Hub 或 Link 表中存业务属性
-
Link 表中的每个关系必须是有业务含义的
-
卫星表可以拆分以按主题或变化频率优化
如果你需要,我可以演示一个 Data Vault 模型的建模过程或生成一张示意图。是否需要?
You said:
ChatGPT said:
好的,下面我将为你演示一个完整的 Data Vault 建模过程,通过一个简单的业务场景来帮助你理解其结构和设计方法。
🌐 场景简介:网上商店(Online Store)
业务对象:
-
客户(Customer)
-
产品(Product)
-
订单(Order)
✅ 第一步:识别 业务主键
我们需要识别每个实体的“自然主键”,这些将成为 Hub 表 的核心。
实体 | 自然主键 |
---|---|
客户 | customer_id |
产品 | product_id |
订单 | order_id |
✅ 第二步:创建 Hub 表
我们为每个主键创建一个 Hub 表,只包含主键 + 元数据(加载时间、数据源等)。
-- 客户中心表 Hub_Customer ( customer_id STRING PRIMARY KEY, load_time TIMESTAMP, record_source STRING ) -- 产品中心表 Hub_Product ( product_id STRING PRIMARY KEY, load_time TIMESTAMP, record_source STRING ) -- 订单中心表 Hub_Order ( order_id STRING PRIMARY KEY, load_time TIMESTAMP, record_source STRING )
✅ 第三步:创建 Link 表
Link 表记录 Hub 之间的关系,比如 “订单属于哪个客户,包含哪个产品”。
-- 客户与订单关系 Link_Customer_Order ( customer_id STRING, order_id STRING, load_time TIMESTAMP, record_source STRING ) -- 订单与产品关系(一个订单可有多个产品) Link_Order_Product ( order_id STRING, product_id STRING, load_time TIMESTAMP, record_source STRING )
✅ 第四步:创建 Satellite 表
Satellite 表负责存储具体业务属性,并保留历史记录。
-- 客户属性 Sat_Customer_Details ( customer_id STRING, customer_name STRING, email STRING, phone STRING, start_time TIMESTAMP, end_time TIMESTAMP, load_time TIMESTAMP, record_source STRING ) -- 产品属性 Sat_Product_Details ( product_id STRING, product_name STRING, category STRING, price DECIMAL, start_time TIMESTAMP, end_time TIMESTAMP, load_time TIMESTAMP, record_source STRING ) -- 订单属性 Sat_Order_Details ( order_id STRING, order_status STRING, order_date DATE, total_amount DECIMAL, start_time TIMESTAMP, end_time TIMESTAMP, load_time TIMESTAMP, record_source STRING )
🧭 架构图示意(文字版)
[Hub_Customer] [Hub_Order] [Hub_Product] | | | | | | | [Link_Customer_Order] | | | | | [Link_Order_Product] | | | | [Sat_Customer] [Sat_Order] [Sat_Product]
🧠 关键点总结:
-
Hub 表:存主键
-
Link 表:存关联关系
-
Satellite 表:存属性和历史