引言
在数据仓库设计中,传统的星型和雪花型模型有着各自的优势和劣势。随着数据量的增大和数据源的多样化,data vault(数据仓库)建模方法逐渐受到关注和应用。data vault建模是一种灵活、可扩展、适应性强的建模方法,特别适用于复杂和动态的数据环境。本文将介绍data vault建模的基本概念、组成部分以及如何在实际项目中应用,并附带详细示例。
目录
data vault建模概述
data vault由丹·林斯塔德(dan linstedt)在1990年代后期提出,是一种适应大规模数据整合的建模方法。它的主要特点包括:

- 高扩展性:适应快速增长的数据量和多变的数据源。
- 高灵活性:易于应对业务规则和数据源的变化。
- 历史数据保留:完整记录数据变化历史。
data vault模型由三类主要实体组成:
- hub(中心表):存储业务主键及其唯一标识符。
- link(链接表):存储不同hub之间的关系。
- satellite(卫星表):存储hub或link的属性和时间戳信息。

hub(中心表)
hub是data vault模型的核心,用于存储业务实体的唯一标识符。每个hub表对应一个业务实体,表中的每一行代表一个业务主键。hub表的结构相对简单,通常包含以下字段:
- 业务主键(business key)
- 哈希键(hash key):用来唯一标识业务主键
- 加载时间戳(load timestamp)
- 记录源(record source):记录数据来源

示例:
create table hub_customer (
customer_hashkey char(32) primary key,
customer_businesskey varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
link(链接表)
link用于定义hub之间的关系。每个link表对应一种业务关系,表中的每一行代表一个关系实例。link表的字段通常包括:
- 哈希键(hash key):唯一标识link
- 外键(foreign key):指向相关的hub
- 加载时间戳(load timestamp)
- 记录源(record source)

示例:
create table link_customerorder (
customerorder_hashkey char(32) primary key,
customer_hashkey char(32),
order_hashkey char(32),
load_timestamp timestamp,
record_source varchar(50)
);
satellite(卫星表)
satellite用于存储hub或link的属性及其变化历史。每个satellite表与一个hub或link相关联,表中的每一行代表一个属性快照。satellite表的字段通常包括:
- 哈希键(hash key):对应的hub或link的哈希键
- 属性字段(attribute fields)
- 加载时间戳(load timestamp)
- 记录源(record source)

示例:
create table sat_customerdetails (
customer_hashkey char(32),
customer_name varchar(255),
customer_address varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
实践中的data vault建模
下面我们通过一个实际例子来展示如何在项目中应用data vault建模。假设我们有一个电商系统,需要整合客户、订单和产品等信息。

步骤一:定义hub表
首先,我们为客户、订单和产品定义hub表。
-- 客户中心表
create table hub_customer (
customer_hashkey char(32) primary key,
customer_businesskey varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
-- 订单中心表
create table hub_order (
order_hashkey char(32) primary key,
order_businesskey varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
-- 产品中心表
create table hub_product (
product_hashkey char(32) primary key,
product_businesskey varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
步骤二:定义link表
接下来,我们定义link表来表示客户和订单、订单和产品之间的关系。
-- 客户与订单关系表
create table link_customerorder (
customerorder_hashkey char(32) primary key,
customer_hashkey char(32),
order_hashkey char(32),
load_timestamp timestamp,
record_source varchar(50)
);
-- 订单与产品关系表
create table link_orderproduct (
orderproduct_hashkey char(32) primary key,
order_hashkey char(32),
product_hashkey char(32),
load_timestamp timestamp,
record_source varchar(50)
);
步骤三:定义satellite表
最后,我们为每个hub和link定义satellite表,用于存储相关的属性信息。
-- 客户属性卫星表
create table sat_customerdetails (
customer_hashkey char(32),
customer_name varchar(255),
customer_address varchar(255),
load_timestamp timestamp,
record_source varchar(50)
);
-- 订单属性卫星表
create table sat_orderdetails (
order_hashkey char(32),
order_date date,
order_amount decimal(10, 2),
load_timestamp timestamp,
record_source varchar(50)
);
-- 产品属性卫星表
create table sat_productdetails (
product_hashkey char(32),
product_name varchar(255),
product_price decimal(10, 2),
load_timestamp timestamp,
record_source varchar(50)
);
总结

data vault建模是一种灵活且扩展性强的数据仓库建模方法,特别适用于复杂和动态的数据环境。
它通过hub、link和satellite表的组合,提供了一种结构化的方法来存储和管理大量的业务数据及其变化历史。
在实际应用中,data vault建模方法能够有效应对数据源和业务需求的变化,为企业提供稳定可靠的数据整合解决方案。
希望本文对您理解和应用data vault建模有所帮助。如果您在实际项目中遇到任何问题,欢迎留言讨论。
发表评论