ZhangZhihui's Blog  

Data Vault 是一种 数据建模方法论,主要用于 企业数据仓库(Enterprise Data Warehouse, EDW) 的建模。它由 Dan Linstedt 于 2000 年提出,目的是应对传统维度建模在处理 大规模、复杂、多变数据 时的不足,尤其适用于 历史数据追踪、数据整合与审计需求高 的场景。


一、Data Vault 的核心概念

Data Vault 模型由三种主要表构成:

表类型作用主要特征
Hub 表(中心表) 存储业务主键(如客户ID、订单ID) 只包含自然主键和加载时间戳
Link 表(链接表) 表示 Hub 之间的关系(如客户下的订单) 引用多个 Hub 的主键,表示关联关系
Satellite 表(卫星表) 存储业务属性和历史变化信息 与 Hub 或 Link 相关联,包含详细字段和时间戳

举例说明:

假设我们有客户(Customer)和订单(Order):

  1. Hub_Customer:客户ID(主键)、加载时间

  2. Hub_Order:订单ID(主键)、加载时间

  3. Link_Customer_Order:客户ID、订单ID、加载时间

  4. Sat_Customer_Details:客户姓名、地址、状态、开始时间、结束时间

  5. 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 表:存属性和历史

 

posted on 2025-08-06 09:38  ZhangZhihuiAAA  阅读(115)  评论(0)    收藏  举报