【總結(jié)】Data Vault數(shù)據(jù)建模過程及舉例

數(shù)據(jù)倉庫2.png

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楣导,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子畜挨,更是在濱河造成了極大的恐慌筒繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朦促,死亡現(xiàn)場離奇詭異膝晾,居然都是意外死亡,警方通過查閱死者的電腦和手機务冕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門血当,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人禀忆,你說我怎么就攤上這事臊旭。” “怎么了箩退?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵离熏,是天一觀的道長。 經(jīng)常有香客問我戴涝,道長滋戳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任啥刻,我火速辦了婚禮奸鸯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘可帽。我一直安慰自己娄涩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布映跟。 她就那樣靜靜地躺著蓄拣,像睡著了一般扬虚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上球恤,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天辜昵,我揣著相機與錄音,去河邊找鬼咽斧。 笑死路鹰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的收厨。 我是一名探鬼主播晋柱,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诵叁!你這毒婦竟也來了雁竞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤拧额,失蹤者是張志新(化名)和其女友劉穎碑诉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥锦,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡进栽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恭垦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片快毛。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖番挺,靈堂內(nèi)的尸體忽然破棺而出唠帝,到底是詐尸還是另有隱情,我是刑警寧澤玄柏,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布襟衰,位于F島的核電站,受9級特大地震影響粪摘,放射性物質(zhì)發(fā)生泄漏瀑晒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一徘意、第九天 我趴在偏房一處隱蔽的房頂上張望苔悦。 院中可真熱鬧,春花似錦映砖、人聲如沸间坐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽竹宋。三九已至,卻和暖如春地技,著一層夾襖步出監(jiān)牢的瞬間蜈七,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工莫矗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留飒硅,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓作谚,卻偏偏與公主長得像三娩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子妹懒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345