DataVault概述
DataVault是数据仓库建模的一种方法,由美国数据仓库专家Dan Linstedt于2000年提出。它旨在解决传统数据仓库建模方法(如星型模型和雪花模型)所存在的固有问题,如难以应对复杂的业务规则和频繁的修改需求等。DataVault方法提供了一种简单、灵活、可伸缩和可维护的数据仓库建模方法,能够更好地满足当前企业数据仓库建设的需要。
DataVault优势
- 可扩展性优于传统模型
DataVault模型在可扩展性方面优于传统模型。它具有简单的结构,可快速适应新的数据源和规则变更。 - 适用于大型数据量
在处理大型数据量方面,DataVault模型比传统模型更高效。DataVault模型使用更少的表进行建模,这节省了空间和使用时间。 - 明确的解决方法
DataVault提供了标准化的解决方法。它着重于公正的数据建模,而不是建模器的主观判断。 - 支持多种集成方式
DataVault支持不同类型的数据集成方式,如ETL、ELT等。这使得数据仓库开发人员能够更好地匹配他们的环境和需求。 - 易于管理和维护
DataVault模型易于管理和维护,这是因为它具有清晰的解决方法,数据可重复使用,模型也能够满足整个企业的需求。
DataVault三个重要构件
在DataVault模型中,有三个重要的构件,分别是:Hub、Link、Satellite。 Hub表示对实体的抽象,Link表示对事实的抽象,而Satellite表示与Hub和Link相关联的附加信息。 他们之间的关系如下图所示:
Hub Link
| |
Satellite----Satellite
1、Hub
Hub是抽象的业务实体,有一个唯一标识符来区分对应的实体。Hub本身并不包括实体的属性(实体属性放在Satellite中)。 例如,有一个叫“客户”的实体,其中有许多客户,我们可以将“客户”命名为Hub,并为每个客户分配一个唯一值。
Hub:客户
|客户ID|
|------|
|001 |
|002 |
2、Link
Link是抽象的业务事实,例如Sales,Order等。Link关联了Hub,将Hub连接在一起,以形成更高水平的集合。Link部分包含两个属性:从Hub转移过来的属性和Link属性自身(如销售日期)。 例如,将客户与订单连接起来,我们可以创建一个“客户订单”连接,其唯一标识符由客户ID和订单号组成。
Hub:客户 Link:客户订单 Hub:订单
|
+-------------|客户ID |订单号 -+
| |------------------------| |
| |
| |客户ID |订单号 |订单日期||
| |---------|---------|----------|| |
| | |
+----------------------------|| |
|散列影子key|
|--------------|
3、Satellite
Satellite包含了与一个给定的Hub或Link关联的业务属性。它与Hub或Link的关系是一对多的,每个属性可以有多个版本(如客户的不同地址)。 例如,客户地址可以作为Satellite放在客户Hub对象中。
Hub:客户
+-------------Satellite:客户地址 1
| |-------客户名称
| |-------客户地址
| |-------版本
| |-------起始时间
| |-------结束时间
|
+-------------Satellite:客户地址 2
|-------客户名称
|-------客户地址
|-------版本
|-------起始时间
|-------结束时间
DataVault实例
现在,让我们来看看如何在DataVault中对一个简单的场景建模。 假设我们正在为一个销售部门创建一个数据仓库。其中包含客户、订单和产品这三个实体,以及客户和订单以及订单和产品之间的关系。 我们使用如下脚本来建模数据仓库:
1、创建Hub
CREATE TABLE H_Customer
(
customer_key int IDENTITY(1,1) NOT NULL,
customer_id INT NOT NULL,
PRIMARY KEY (customer_key)
);
CREATE TABLE H_Product
(
product_key int IDENTITY(1,1) NOT NULL,
product_id INT NOT NULL,
PRIMARY KEY (product_key)
);
CREATE TABLE H_Order
(
order_key int IDENTITY(1,1) NOT NULL,
order_id INT NOT NULL,
PRIMARY KEY (order_key)
);
2、创建Satellite
CREATE TABLE S_Customer
(
customer_key int NOT NULL,
effective_from_date datetime NOT NULL,
effective_to_date datetime NOT NULL,
customer_name NVARCHAR(50) NULL,
customer_address NVARCHAR(50) NULL
);
CREATE TABLE S_Product
(
product_key int NOT NULL,
effective_from_date datetime NOT NULL,
effective_to_date datetime NOT NULL,
product_name NVARCHAR(50) NULL,
product_code NVARCHAR(10) NULL
);
CREATE TABLE S_Order
(
order_key int NOT NULL,
effective_from_date datetime NOT NULL,
effective_to_date datetime NOT NULL,
order_date datetime NULL
);
3、创建Link
CREATE TABLE L_CustomerOrder
(
customer_key int NOT NULL,
order_key int NOT NULL
);
CREATE TABLE L_OrderProduct
(
order_key int NOT NULL,
product_key int NOT NULL
);
4、附加脚本
ALTER TABLE S_Customer ADD CONSTRAINT PK_S_Customer PRIMARY KEY(Customer_Key, Effective_From_Date);
ALTER TABLE S_Customer ADD
CONSTRAINT FK_S_Customer__H_Customer FOREIGN KEY(Customer_Key)
REFERENCES H_Customer(Customer_Key);
ALTER TABLE S_Product ADD CONSTRAINT PK_S_Product PRIMARY KEY(Product_Key, Effective_From_Date);
ALTER TABLE S_Product ADD
CONSTRAINT FK_S_Product__H_Product FOREIGN KEY(Product_Key)
REFERENCES H_Product(Product_Key);
ALTER TABLE S_Order ADD CONSTRAINT PK_S_Order PRIMARY KEY(Order_Key, Effective_From_Date);
ALTER TABLE S_Order ADD
CONSTRAINT FK_S_Order__H_Order FOREIGN KEY(Order_Key)
REFERENCES H_Order(Order_Key);
ALTER TABLE L_CustomerOrder ADD CONSTRAINT PK_L_CustomerOrder PRIMARY KEY(Customer_Key, Order_Key);
ALTER TABLE L_CustomerOrder ADD
CONSTRAINT FK_L_CustomerOrder__H_Customer FOREIGN KEY(Customer_Key)
REFERENCES H_Customer(Customer_Key);
ALTER TABLE L_CustomerOrder ADD
CONSTRAINT FK_L_CustomerOrder__H_Order FOREIGN KEY(Order_Key)
REFERENCES H_Order(Order_Key);
ALTER TABLE L_OrderProduct ADD CONSTRAINT PK_L_OrderProduct PRIMARY KEY(Order_Key, Product_Key);
ALTER TABLE L_OrderProduct ADD
CONSTRAINT FK_L_OrderProduct__H_Order FOREIGN KEY(Order_Key)
REFERENCES H_Order(Order_Key);
ALTER TABLE L_OrderProduct ADD
CONSTRAINT FK_L_OrderProduct__H_Product FOREIGN KEY(Product_Key)
REFERENCES H_Product(Product_Key);
总结
DataVault基于Hub、Link和Satellite三个重要构件的特点,提供了一个简单、灵活、可伸缩和可维护的数据仓库建模方法。使用DataVault方法能够更好地满足当前企业数据仓库建设的需要。以上是一个简单的DataVault建模实例,可以帮助你更好地理解DataVault建模的过程和构件的特点。