DataVault入门指南

发布时间:2023-05-19

DataVault概述

DataVault是数据仓库建模的一种方法,由美国数据仓库专家Dan Linstedt于2000年提出。它旨在解决传统数据仓库建模方法(如星型模型和雪花模型)所存在的固有问题,如难以应对复杂的业务规则和频繁的修改需求等。DataVault方法提供了一种简单、灵活、可伸缩和可维护的数据仓库建模方法,能够更好地满足当前企业数据仓库建设的需要。

DataVault优势

  1. 可扩展性优于传统模型
    DataVault模型在可扩展性方面优于传统模型。它具有简单的结构,可快速适应新的数据源和规则变更。
  2. 适用于大型数据量
    在处理大型数据量方面,DataVault模型比传统模型更高效。DataVault模型使用更少的表进行建模,这节省了空间和使用时间。
  3. 明确的解决方法
    DataVault提供了标准化的解决方法。它着重于公正的数据建模,而不是建模器的主观判断。
  4. 支持多种集成方式
    DataVault支持不同类型的数据集成方式,如ETL、ELT等。这使得数据仓库开发人员能够更好地匹配他们的环境和需求。
  5. 易于管理和维护
    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   |

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
);
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建模的过程和构件的特点。