1. 摘要
本文介紹數(shù)據(jù)倉庫中Data Vault建模的過程描述括细,并舉一個示例以加深對相關(guān)概念的理解汰蓉。
2. 內(nèi)容
2.1 關(guān)于Data Vault數(shù)據(jù)模型
Data Vault(DV)模型用于企業(yè)級的數(shù)據(jù)倉庫建模,是Dan Linstedt在20世紀(jì)90年代提出的椰棘。在最近幾年波丰,Data Vault模型獲得了很多關(guān)注母债。
Data Vault是一種數(shù)據(jù)倉庫建模方法赋荆,用來存儲來自多個操作型系統(tǒng)的完整的歷史數(shù)據(jù)笋妥。
Data Vault方法需要跟蹤所有數(shù)據(jù)的來源,因此其中每個數(shù)據(jù)行都要包含數(shù)據(jù)來源和裝載時間屬性窄潭, 用以審計和跟蹤數(shù)據(jù)值所對應(yīng)的源系統(tǒng)春宣。
Data Vault不區(qū)分?jǐn)?shù)據(jù)在業(yè)務(wù)層面的正確與錯誤, 它保留操作型系統(tǒng)的所有時間的所有數(shù)據(jù)嫉你, 裝載數(shù)據(jù)時不做數(shù)據(jù)驗證月帝、清洗等工作, 這點明顯有別于其他數(shù)據(jù)倉庫建模方法均抽。
Data Vault建模方法顯式地將結(jié)構(gòu)信息和屬性信息分離嫁赏, 能夠還原業(yè)務(wù)環(huán)境的變化。 Data Vault允許并行數(shù)據(jù)裝載油挥,不需要重新設(shè)計就可以實現(xiàn)擴(kuò)展潦蝇。
Data Vault是面向細(xì)節(jié)的,可追蹤歷史的深寥,一組有連接關(guān)系的規(guī)范化的表的集合攘乒。 這些表可以支持一個或多個業(yè)務(wù)功能。
它是一種綜合了第三范式(3NF)和星型模型優(yōu)點的建模方法惋鹅。
其設(shè)計理念是要滿足企業(yè)對靈活性则酝、 可擴(kuò)展性、 一致性和對需求的適應(yīng)性要求闰集, 是一種專為企業(yè)級數(shù)據(jù)倉庫量身定制的建模方式
2.2 Data Vault 模型各類表說明
對于Data Vault主要分為3種類型的表:中心表沽讹,鏈接表,衛(wèi)星表(附屬表)武鲁。
2.2.1 中心表(Hub)
對于構(gòu)建Data Vault模型的爽雄,第一件事就是構(gòu)建中心表,中心表示DV模型中的核心沐鼠。如果設(shè)計得當(dāng)挚瘟,將可以兼容整合各種數(shù)據(jù)源。
為了達(dá)到這點饲梭,就應(yīng)該假設(shè)系統(tǒng)源是不可知的乘盖,所以中心表應(yīng)該依賴于實際的業(yè)務(wù)邏輯標(biāo)識,而不是使用代理鍵憔涉。
中心表的表結(jié)構(gòu):
字段 | 說明 |
---|---|
hub_key | 代理主鍵订框,通過對業(yè)務(wù)主鍵進(jìn)行MD5計算所得 |
business_key | 業(yè)務(wù)主鍵,唯一標(biāo)識業(yè)務(wù)主鍵,來之源系統(tǒng) |
load_dts | 數(shù)據(jù)第一次轉(zhuǎn)載的時間,只記錄第一次轉(zhuǎn)載時間 |
rec_src | 數(shù)據(jù)源系統(tǒng) |
2.2.2 鏈接表(Link)
鏈接表的目的是為了靈活性和易擴(kuò)展兜叨,通過鏈接表可以在不改變原有的構(gòu)架和轉(zhuǎn)載條件下進(jìn)行擴(kuò)展布蔗。在Data Vault模型中所有的
關(guān)系和事件都是通過鏈接表來表示藤违。在DV模型中,中心表沒有外鍵纵揍,對于中心表間的連接是通過鏈接表顿乒。所以鏈接表至少要有兩個父中心表。
鏈接表表結(jié)構(gòu):
字段 | 說明 |
---|---|
link_key | 代理主鍵泽谨,使用相關(guān)的父Hub表的業(yè)務(wù)主鍵拼接后計算MD5值 |
hub_keys | hubs的代理鍵 |
hub_business_keys | hubs的業(yè)務(wù)主鍵 |
load_dts | 第一次裝載數(shù)據(jù)的時間 |
rec_src | 源系統(tǒng)信息 |
2.2.3 衛(wèi)星表(附屬表Satellite)
衛(wèi)星表示所有的原始數(shù)據(jù)系統(tǒng)璧榄,在這個表中也捕獲數(shù)據(jù)的變化,所以這種表有點像維度模型中的漸變維度表吧雹。
一個附屬表總有一個且唯一一個外鍵引用到中心表或鏈接表骨杂。
字段 | 說明 |
---|---|
sta_key | 代理主鍵,相關(guān)的hub或link表的主鍵和數(shù)據(jù)載入時間的MD5值 |
hub_or_link_key | 父hub或Link的代理主鍵 |
attribute_columns | 屬性數(shù)據(jù)列 |
hash_diff | 各列拼接后的MD5值計算 |
sat_load_dts | 數(shù)據(jù)裝載時間 |
sat_rec_src | 數(shù)據(jù)來源信息 |
2.2.4 總結(jié)
表 | 關(guān)鍵字 | 作用 |
---|---|---|
Hubs中心表 | business_key業(yè)務(wù)主鍵 | 使其以業(yè)務(wù)為導(dǎo)向, 并允許跨系統(tǒng)集成 |
Links鏈接表 | Associations/Transactions關(guān)聯(lián)和轉(zhuǎn)換 | 提供了在無需重新設(shè)計的情況下吸收結(jié)構(gòu)和業(yè)務(wù)規(guī)則更改的靈活性 |
Satellites附屬表 | Descriptors描述性信息 | 提供在任何想要的時間間隔內(nèi)記錄歷史記錄的適應(yīng)性, 以及對源系統(tǒng)的無可爭辯的可審核性和可追溯性 |
總之, 通過Data Vault模型可以獲得敏捷性雄卷、靈活性搓蚪、適應(yīng)性、可審核性丁鹉、可擴(kuò)展性.
2.3 Data Vault建模實踐
本示例源數(shù)據(jù)庫是一個訂單銷售的普通場景妒潭,共有省、市揣钦、客戶雳灾、產(chǎn)品類型、產(chǎn)品冯凹、訂單谎亩、訂單明細(xì)7個表。ERD如下圖所示宇姚。
使用下面的腳本建立源數(shù)據(jù)庫表:
CREATE TABLE province (
province_id varchar(2) NOT NULL COMMENT '省份編碼',
province_name varchar(20) DEFAULT NULL COMMENT '省份名稱',
PRIMARY KEY (province_id)
) ;
CREATE TABLE product_catagory (
product_catagory_id varchar(2) NOT NULL COMMENT '產(chǎn)品分類編碼',
product_catagory_name varchar(20) DEFAULT NULL COMMENT '產(chǎn)品分類名稱',
PRIMARY KEY (product_catagory_id)
) ;
CREATE TABLE city (
city_id varchar(4) NOT NULL COMMENT '城市編碼',
city_name varchar(20) DEFAULT NULL COMMENT '城市編碼',
province_id varchar(2) DEFAULT NULL COMMENT '省份編碼',
PRIMARY KEY (city_id),
FOREIGN KEY (province_id) REFERENCES province (province_id)
) ;
CREATE TABLE customer (
customer_id int(11) NOT NULL AUTO_INCREMENT COMMENT '客戶ID',
customer_name varchar(20) DEFAULT NULL COMMENT '客戶名稱',
city_id varchar(4) DEFAULT NULL COMMENT '城市ID',
cust_post_code varchar(6) DEFAULT NULL COMMENT '客戶郵編',
cust_address varchar(50) DEFAULT NULL COMMENT '客戶地址',
ship_post_code varchar(6) DEFAULT NULL COMMENT '送貨郵編',
ship_address varchar(50) DEFAULT NULL COMMENT '送貨地址',
PRIMARY KEY (customer_id),
FOREIGN KEY (city_id) REFERENCES city (city_id)
) ;
CREATE TABLE product (
product_id int(11) NOT NULL AUTO_INCREMENT COMMENT '產(chǎn)品ID',
product_name varchar(20) DEFAULT NULL COMMENT '產(chǎn)品名稱',
unit_price decimal(10,4) DEFAULT NULL COMMENT '產(chǎn)品單價',
product_catagory_id varchar(2) DEFAULT NULL COMMENT '產(chǎn)品分類編碼',
PRIMARY KEY (product_id),
FOREIGN KEY (product_catagory_id) REFERENCES product_catagory (product_catagory_id)
) ;
CREATE TABLE sales_order (
sales_order_id int(11) NOT NULL AUTO_INCREMENT COMMENT '訂單ID',
order_time datetime DEFAULT NULL COMMENT '下單時間',
entry_time datetime DEFAULT NULL COMMENT '錄入時間',
customer_id int(11) DEFAULT NULL COMMENT '客戶ID',
amount decimal(12,4) DEFAULT NULL COMMENT '訂單金額',
allocate_time datetime DEFAULT NULL COMMENT '分配庫房時間',
packing_time datetime DEFAULT NULL COMMENT '出庫時間',
ship_time datetime DEFAULT NULL COMMENT '配送時間',
receive_time datetime DEFAULT NULL COMMENT '收貨時間',
PRIMARY KEY (sales_order_id),
FOREIGN KEY (customer_id) REFERENCES customer (customer_id)
) ;
CREATE TABLE sales_order_item (
sales_order_item_id int(11) NOT NULL AUTO_INCREMENT COMMENT '訂單明細(xì)ID',
sales_order_id int(11) DEFAULT NULL COMMENT '訂單ID',
product_id int(11) DEFAULT NULL COMMENT '產(chǎn)品ID',
unit_price decimal(10,4) DEFAULT NULL COMMENT '產(chǎn)品單價',
quantity int(11) DEFAULT NULL COMMENT '數(shù)量',
PRIMARY KEY (sales_order_item_id),
FOREIGN KEY (sales_order_id) REFERENCES sales_order (sales_order_id),
FOREIGN KEY (product_id) REFERENCES product (product_id)
) ;
將示例轉(zhuǎn)換成Data Vault模型匈庭。
1. 轉(zhuǎn)換中心表
(1)確定中心實體
示例中的客戶、產(chǎn)品類型浑劳、產(chǎn)品阱持、訂單、訂單明細(xì)這5個實體是訂單銷售業(yè)務(wù)的中心實體呀洲。省紊选、市等地理信息表是參考數(shù)據(jù)啼止,不能算是中心實體道逗,實際上是附屬表。
(2)把第一步確定的中心實體中有入邊的實體轉(zhuǎn)換為中心表献烦,因為這些實體被別的實體引用滓窍。
把客戶、產(chǎn)品類型巩那、產(chǎn)品吏夯、訂單轉(zhuǎn)換成中心表
(3)把第一步確定的中心實體中沒有入邊且只有一條出邊的實體轉(zhuǎn)換為中心表此蜈,因為必須至少有兩個Hub才能產(chǎn)生一個有意義的Link。
示例中沒有這樣的表噪生。下表列出了所有中心表
實體 | 業(yè)務(wù)主鍵 |
---|---|
hub_product_catagory | product_catagory_id |
hub_customer | customer_id |
hub_product | product_id |
hub_sales_order | sales_order_id |
2. 轉(zhuǎn)換鏈接表
(1)把源庫中沒有入邊且有兩條或兩條以上出邊的實體直接轉(zhuǎn)換成鏈接表
把訂單明細(xì)轉(zhuǎn)換成鏈接表
(2)把源庫中除第一步以外的外鍵關(guān)系轉(zhuǎn)換成鏈接表裆赵。
訂單和客戶之間建立鏈接表,產(chǎn)品和產(chǎn)品類型之間建立鏈接表跺嗽。注意Data Vault模型中的每個關(guān)系都是多對多關(guān)系战授。
下表列出了所有鏈接表
鏈接表 | 被鏈接的中心表 |
---|---|
link_order_product | hub_sales_order,hub_product |
link_order_customer | hub_sales_order桨嫁,hub_customer |
link_product_catagory | hub_product植兰,hub_product_catagory |
3. 3. 轉(zhuǎn)換附屬表
附屬表為中心表和鏈接表補充屬性。所有源庫中用到的表的非鍵屬性都要放到Data Vault模型中璃吧。
下表列出了所有附屬表
附屬表 | 描述 |
---|---|
sat_customer | hub_customer |
sat_product_catagory | hub_product_catagory |
sat_product | hub_product |
sat_sales_order | hub_sales_order |
sat_order_product | link_order_product |
使用下面的腳本建立Data Vault數(shù)據(jù)庫表:
create table hub_product_catagory (
hub_product_catagory_id int auto_increment primary key,
product_catagory_id varchar(2),
load_dts timestamp,
record_source varchar(100)
);
create table hub_customer (
hub_customer_id int auto_increment primary key,
customer_id int,
load_dts timestamp,
record_source varchar(100)
);
create table hub_product (
hub_product_id int auto_increment primary key,
product_id int,
load_dts timestamp,
record_source varchar(100)
);
create table hub_sales_order (
hub_sales_order_id int auto_increment primary key,
sales_order_id int,
load_dts timestamp,
record_source varchar(100)
);
create table link_order_product (
link_order_product_id int auto_increment primary key,
hub_sales_order_id int,
hub_product_id int,
load_dts timestamp,
record_source varchar(100),
foreign key (hub_sales_order_id)
references hub_sales_order (hub_sales_order_id),
foreign key (hub_product_id)
references hub_product (hub_product_id)
);
create table link_order_customer (
link_order_customer_id int auto_increment primary key,
hub_sales_order_id int,
hub_customer_id int,
load_dts timestamp,
record_source varchar(100),
foreign key (hub_sales_order_id)
references hub_sales_order (hub_sales_order_id),
foreign key (hub_customer_id)
references hub_customer (hub_customer_id)
);
create table link_product_catagory (
link_product_catagory_id int auto_increment primary key,
hub_product_id int,
hub_product_catagory_id int,
load_dts timestamp,
record_source varchar(100),
foreign key (hub_product_id)
references hub_product (hub_product_id),
foreign key (hub_product_catagory_id)
references hub_product_catagory (hub_product_catagory_id)
);
create table sat_customer (
sat_customer_id int auto_increment primary key,
hub_customer_id int,
load_dts timestamp,
load_end_dts timestamp,
record_source varchar(100),
customer_name varchar(20),
city_name varchar(20),
province_name varchar(20),
cust_post_code varchar(6),
cust_address varchar(50),
ship_post_code varchar(6),
ship_address varchar(50),
foreign key (hub_customer_id)
references hub_customer (hub_customer_id)
);
create table sat_product_catagory (
sat_product_catagory_id int auto_increment primary key,
hub_product_catagory_id int,
load_dts timestamp,
load_end_dts timestamp,
record_source varchar(100),
product_catagory_name varchar(20),
foreign key (hub_product_catagory_id)
references hub_product_catagory (hub_product_catagory_id)
);
create table sat_product (
sat_product_id int auto_increment primary key,
hub_product_id int,
load_dts timestamp,
load_end_dts timestamp,
record_source varchar(100),
product_name varchar(20),
unit_price decimal(10 , 4 ),
foreign key (hub_product_id)
references hub_product (hub_product_id)
);
create table sat_sales_order (
sat_sales_order_id int auto_increment primary key,
hub_sales_order_id int,
load_dts timestamp,
load_end_dts timestamp,
record_source varchar(100),
order_time datetime,
entry_time datetime,
amount decimal(12 , 4 ),
allocate_time datetime,
packing_time datetime,
ship_time datetime,
receive_time datetime,
foreign key (hub_sales_order_id)
references hub_sales_order (hub_sales_order_id)
);
create table sat_order_product (
sat_order_product_id int auto_increment primary key,
link_order_product_id int,
load_dts timestamp,
load_end_dts timestamp,
record_source varchar(100),
unit_price decimal(10 , 4 ),
quantity int,
foreign key (link_order_product_id)
references link_order_product (link_order_product_id)
);
Data Vault模型如下圖所示:
3. 參考
(1)Data Vault 數(shù)據(jù)倉庫模型構(gòu)建-1
http://www.reibang.com/p/df3684c20092
(2)Data Vault初探(三) —— 建立Data Vault模型
https://blog.csdn.net/wzy0623/article/details/50222269