建立 Data Vault 模型_data vault实例-程序员宅基地

技术标签: 数据架构  数据仓库  

本示例源数据库是一个订单销售的普通场景,共有省、市、客户、产品类型、产品、订单、订单明细7个表。ERD如下图所示。

 

使用下面的脚本建立源数据库表:

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 '产品分类编码',
  product_catagory_name varchar(20) DEFAULT NULL COMMENT '产品分类名称',
  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 '产品ID',
  product_name varchar(20) DEFAULT NULL COMMENT '产品名称',
  unit_price decimal(10,4) DEFAULT NULL COMMENT '产品单价',
  product_catagory_id varchar(2) DEFAULT NULL COMMENT '产品分类编码',
  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 '订单明细ID',
  sales_order_id int(11) DEFAULT NULL COMMENT '订单ID',
  product_id int(11) DEFAULT NULL COMMENT '产品ID',
  unit_price decimal(10,4) DEFAULT NULL COMMENT '产品单价',
  quantity int(11) DEFAULT NULL COMMENT '数量',
  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)
) ;

将示例转换成Data Vault模型。

1. 转换中心表

(1)确定中心实体

示例中的客户、产品类型、产品、订单、订单明细这5个实体是订单销售业务的中心实体。省、市等地理信息表是参考数据,不能算是中心实体,实际上是附属表。

(2)把第一步确定的中心实体中有入边的实体转换为中心表,因为这些实体被别的实体引用。

把客户、产品类型、产品、订单转换成中心表

(3)把第一步确定的中心实体中没有入边且只有一条出边的实体转换为中心表,因为必须至少有两个Hub才能产生一个有意义的Link。

示例中没有这样的表。

下表列出了所有中心表

 

2. 转换链接表

(1)把源库中没有入边且有两条或两条以上出边的实体直接转换成链接表

把订单明细转换成链接表

(2)把源库中除第一步以外的外键关系转换成链接表。

订单和客户之间建立链接表,产品和产品类型之间建立链接表。注意Data Vault模型中的每个关系都是多对多关系。

下表列出了所有链接表

3. 转换附属表

附属表为中心表和链接表补充属性。所有源库中用到的表的非键属性都要放到Data Vault模型中。

下表列出了所有附属表

使用下面的脚本建立Data Vault数据库表:

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模型如下图所示:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Luomingkui1109/article/details/91341419

智能推荐

数据库总结-程序员宅基地

文章浏览阅读92次。数据库知识总结SQLOracleSQL ServerMysqlNoSQL键值型 Redis文档型 Mongo搜索引擎 ElasticSearch列式数据库 ClickHouse图形数据库 GraphQL

CRT Library Features_crt的features-程序员宅基地

文章浏览阅读609次。转载自: https://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.120).aspxThis topic discusses the various .lib files that comprise the C run-time libraries as well as their associated compiler_crt的features

CSS3实现5个常用的网页动画效果-程序员宅基地

文章浏览阅读7.2k次,点赞12次,收藏79次。点击上方“前端开发博客”,选择“星标”每天前端开发干货第一时间送达!作者:郭锦荣链接:https://www.cnblogs.com/jr1993/p/4743914.html由于最近比..._使用css3的过渡和动画属性可以制作出哪些网页特效

2022爱分析·营销服务一体化实践报告_服务营销一体化-程序员宅基地

文章浏览阅读3.1k次。报告编委特别鸣谢(按拼音排序)报告摘要随着互联网流量红利逐渐见顶,加之消费升级速度趋快,优质的客户体验逐渐成为企业的核心竞争力。提升客户体验,需要企业借助先进的技术工具将服务升级并贯穿于客户全旅程,构建以客户为中心的“营销-销售-服务”一体化体系,进行精准营销和精细化运营,在客户旅程各个环节深化企业与客户的连接,助力企业业务新增长。本报告重点选取营销科技、智能售后和智能客服三个市场作为重点研究对象,对企业“营销-销售-服务”一体化建设进行研究。营销科技随着客群需求的不断变化及业务场景的持续._服务营销一体化

Python+Selenium学习笔记02-从本地上传文件_python上传本地文件button-程序员宅基地

文章浏览阅读803次。Python+Selenium如何实现从本地选择文件上传可难为了我这个小菜鸟。通过查阅资料发现可以借助Autolt工具实现,因为是刚开始学,也不确定这种方式是不是最好的==,仅供大家参考1.使用Autolt创建应用程序1.下载并安装Autoit https://www.autoitscript.com/cgi-bin/getfile.pl?autoit3/autoit-v3-setup..._python上传本地文件button

EVSSL证书、OVSSL证书、DVSSL证书有什么区别_ssl dvssl ovssl evssl san-程序员宅基地

文章浏览阅读1.2k次。网站如果想要实现HTTPS加密传输的话就需要安装一个合适的SSL证书。当前比较受欢迎的证书有EVSSL证书、OVSSL证书、DVSSL证书,那么这三种证书究竟有什么区别呢?接下来就来详细的说明一下。EVSSL证书是扩展延伸型的证书。电子证书认证机构会审核证书申请人对域名的所有权,需要提供企业的详情信息,验证身份和域名所有权安装完之后,EVSSL证书是适合所有企业类型的,因此EVSSL证书的范围非..._ssl dvssl ovssl evssl san

随便推点

华为实验记录配置OSPF虚链路_ensp ospf虚链路认证不生效-程序员宅基地

文章浏览阅读1.1k次。搭建实验环境:1)公司网络扩容,新区域与骨干区域无法相连2)通过配置虚链路解决问题实现此案例需要按照如下步骤进行。interface GigabitEthernet0/0/0 ip address 192.168.14.1 255.255.255.0 interface GigabitEthernet0/0/1 ip address 192.168.12.1 255.255.25..._ensp ospf虚链路认证不生效

java计算机毕业设计航空机票预订系统源码+mysql数据库+系统+lw文档+部署_数据库机票预订系统源代码-程序员宅基地

文章浏览阅读177次。java计算机毕业设计航空机票预订系统源码+mysql数据库+系统+lw文档+部署。springboot基于SpringBoot的在线古玩市场系统的设计与实现。springcloud基于微服务架构的小区生活服务平台的设计与实现。前端技术:Layui、HTML、CSS、JS、JQuery等技术。springboot基于互联网的图书管理系统—借阅管理子模块。基于SSM框架的校园爱心公益平台的设计与实现。springboot扶贫助农与产品合作系统。ssm基于Web的精品课程网站的设计与实现。_数据库机票预订系统源代码

Java开发笔记(三十五)字符串格式化-程序员宅基地

文章浏览阅读74次。前面介绍了字符串变量的四种赋值方式,对于简单的赋值来说完全够用了,即便是两个字符串拼接,也只需通过加号把两个目标串连起来即可。但对于复杂的赋值来说就麻烦了,假设现在需要拼接一个很长的字符串,字符串内部包含了各种类型的变量,有整型,有双精度型,有布尔型,有字符型,中间还夹杂着一些起粘合作用的子串,如此一来只能使劲地填写加号,把各种变量努力加加加加上去,就像有时打印日志调用System.out.pri..._java 123456789012345678

MySQL学习笔记-01_以下语句错误的是( ) 单选题 (1.5 分) a. alter table emp modify -程序员宅基地

文章浏览阅读321次。1、初识MySQLJavaEE:企业级Java开发 Web前端(页面:展示,数据)后台(连接点:连接数据库JDBC,连接前端(控制,控制视图跳转,和给前端传递数据))数据库(存数据,Txt,Excel,word)只会写代码,学号数据库,基本混饭吃操作系统,数据结构与算法,当一个不错的程序员离散数学,数字电路,体系结构,编译原理,+ 实战经验,高级程序员=优秀程序员1.1 为什么..._以下语句错误的是( ) 单选题 (1.5 分) a. alter table emp modify column addcolu

TTS 配置_tts server配置导入-程序员宅基地

文章浏览阅读6.1k次。1、安装 tts_commandline 模块2、配置文件修改/usr/local/freeswitch/conf/autoload_configs/tts_commandline.conf.xml value="wget -O temp.txt http://localhost:5555/tts/tts?word=${text}MMMM${file} ; lua tt_tts server配置导入

ServiceConnection-程序员宅基地

文章浏览阅读1.4w次,点赞6次,收藏28次。绑定到一个Service应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder.绑定是异步的.bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给b..._serviceconnection

推荐文章

热门文章

相关标签