拉链表

拉链表是维护历史状态、以及最新状态的一种方式。

拉链表对快照表进行了优化,根据拉链粒度(一般为时间)的不同,去除了在粒度范围内不变的数据。

拉链表可以维护两个时间(start_time, end_time),来标识当前记录是否还有效,以及更好的定位历史数据

实现前提:

首先要有某一时刻的全量数据,作为起始表

其次要有流水表或者快照表两者其一,作为变化的依据

在数据仓库中,经常会用历史数据和时间维度做数据分析。而保存历史数据最常见的方案是使用拉链表进行存储。

创建测试表(以MySQL为例子)

create table deal_order
(order_id varchar(20) comment '订单ID',        order_updatetime date comment '订单更新时间',         order_status_cn varchar(50) comment '订单更新状态'
);

插入数据

insert into deal_order values('100001',date_format('2020-05-07 12:23:18','%Y-%m-%d %H:%i:%S'),'订单创建');
insert into deal_order values('100002',date_format('2020-05-07 16:48:05','%Y-%m-%d %H:%i:%S'),'订单创建');
insert into deal_order values('100003',date_format('2020-05-07 20:47:25','%Y-%m-%d %H:%i:%S'),'支付完成');

所以2020年5月7日的订单情况如下

第二天订单发生改变

update deal_orderset order_updatetime = date_format('2020-05-08 09:12:46', '%Y-%m-%d %H:%i:%S'),order_status_cn = '等待支付'where order_id = '100001';
update deal_orderset order_updatetime = date_format('2020-05-08 13:25:15', '%Y-%m-%d %H:%i:%S'),order_status_cn = '已发货'where order_id = '100003';
insert into deal_order values('100004',date_format('2020-05-08 16:11:48','%Y-%m-%d %H:%i:%S'),'等待发货');
insert into deal_order values('100005',date_format('2020-05-08 18:23:31','%Y-%m-%d %H:%i:%S'),'等待发货');

2020年5月8日订单详情

到了2020年5月9日,部分订单再次发生了改变,并且有了新的订单:

update deal_orderset order_updatetime = date_format('2020-05-09 11:28:35', '%Y-%m-%d %H:%i:%S'),order_status_cn = '订单关闭'where order_id = '100002';
update deal_orderset order_updatetime = date_format('2020-05-09 14:48:48', '%Y-%m-%d %H:%i:%S'),order_status_cn = '交易完成'where order_id = '100003';
update deal_orderset order_updatetime = date_format('2020-05-09 17:09:34', '%Y-%m-%d %H:%i:%S'),order_status_cn = '支付成功'where order_id = '100005';
insert into deal_order values('100006',date_format('2020-05-09 19:49:55','%Y-%m-%d %H:%i:%S'),'等待发货');

5月9日状态:

对于上述表来说,由于没有保存历史数据,因此查询“100001”订单的状态历史就查询不到。如果使用历史拉链表来存储以上信息,则存储内容如下:

create table deal_order_zipper_tb
(order_id varchar(20) comment '订单ID',order_updatetime date comment '订单更新时间',order_status_cn varchar(50) comment '订单当前状态',order_start_time date comment '该记录生命周期开始时间(包括该时间点)',order_end_time date comment '该记录生命周期结束时间(不包括该时间点)'
);

历史拉链表中,增加了记录的生命周期开始时间和结束时间,一条记录的生命周期为 [生命周期开始时间,生命周期结束时间)。

将原来的数据导入到历史拉链表,最终结果如下

 insert into deal_order_zipper_tb values('100001',date_format('2020-05-07 12:23:18','%Y-%m-%d %H:%i:%S'),'订单创建',date_format('2020-05-07 12:23:18','%Y-%m-%d %H:%i:%S'),date_format('2020-05-08 09:12:46','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100001',date_format('2020-05-07 12:23:18','%Y-%m-%d %H:%i:%S'),'等待支付',date_format('2020-05-08 09:12:46','%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100002',date_format('2020-05-07 16:48:05','%Y-%m-%d %H:%i:%S'),'订单创建',date_format('2020-05-07 16:48:05','%Y-%m-%d %H:%i:%S'),date_format('2020-05-09 11:28:35','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100002',date_format('2020-05-07 16:48:05','%Y-%m-%d %H:%i:%S'),'订单关闭',date_format('2020-05-09 11:28:35','%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100003',date_format('2020-05-07 20:47:25','%Y-%m-%d %H:%i:%S'),'支付完成',date_format('2020-05-07 20:47:25','%Y-%m-%d %H:%i:%S'),date_format('2020-05-08 13:25:15', '%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100003',date_format('2020-05-07 20:47:25','%Y-%m-%d %H:%i:%S'),'已发货',date_format('2020-05-08 13:25:15', '%Y-%m-%d %H:%i:%S'),date_format('2020-05-09 14:48:48', '%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100003',date_format('2020-05-07 20:47:25','%Y-%m-%d %H:%i:%S'),'交易完成',date_format('2020-05-09 14:48:48', '%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100004',date_format('2020-05-08 16:11:48','%Y-%m-%d %H:%i:%S'),'等待发货',date_format('2020-05-08 16:11:48','%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100005',date_format('2020-05-08 18:23:31','%Y-%m-%d %H:%i:%S'),'等待发货',date_format('2020-05-08 18:23:31','%Y-%m-%d %H:%i:%S'),date_format('2020-05-09 17:09:34', '%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100005',date_format('2020-05-08 18:23:31','%Y-%m-%d %H:%i:%S'),'支付成功',date_format('2020-05-09 17:09:34', '%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));insert into deal_order_zipper_tb values('100006',date_format('2020-05-09 19:49:55','%Y-%m-%d %H:%i:%S'),'等待发货',date_format('2020-05-09 19:49:55','%Y-%m-%d %H:%i:%S'),date_format('9999-09-09 23:59:59','%Y-%m-%d %H:%i:%S'));

此时的订单状态

如果需要查询2020年5月8日的历史快照,可以直接写出SQL:

select * from deal_order_zipper_tb dwhere d.order_start_time < date_format('2020-05-09', '%Y-%m-%d')and d.order_end_time >= date_format('2020-05-09', '%Y-%m-%d');

该SQL的查询结果与之前2020-05-08的数据一致:

SQL文件:https://download.csdn.net/download/zhangvalue/12897367

数据仓库历史数据存储-拉链表相关推荐

  1. 数据仓库历史数据存储 - 拉链表

    假如我们有一个账号account表,我们需要在hive中存储(数据是从线上mysql读取binlog同步来的,是有明细变化的) account表结构:account_id, username, fol ...

  2. 数据仓库中历史拉链表的更新方法

    原文地址:http://lxw1234.com/archives/2015/08/473.htm 这里简单介绍一下这种历史拉链表的更新方法. 本文中假设: 数据仓库中订单历史表的刷新频率为一天,当天更 ...

  3. hql取满足条件最新一条记录_数据仓库怎么做拉链表记录数据变化情况,看看这篇文章 就明白了...

    小文老师给你讲解数据仓库的ETL拉链算法,通过这篇文档,让你快速了解数据拉链. 一 首先我们先来看下,什么是拉链?在数据仓库中,拉链就是记录数据在某一时间区间内的状态以及数据在某一时间点上的数据变化的 ...

  4. 【clickhouse】数据仓库中的拉链表(Clickhouse 实现)

    文章目录 1.概述 在 Clickhouse 中实现拉链表 一. 每日的用户更新表: 二. ods 层的 user 表: ods 层的 user_update 表 拉链表: 拉链表和流水表: 查询性能 ...

  5. Hive数据仓库中历史拉链表实践

    数据准备 在mysql中创建测试表orders CREATE TABLE `orders` (`orderid` int(11) NOT NULL AUTO_INCREMENT,`status` va ...

  6. 数仓--拉链表(原理、设计以及在Hive中的实现)

    拉链表 什么是拉链表? 谈到拉链表就不得不谈SCD(缓慢变化维问题) 缓慢变化维怎么解决?(粗看有五种) 保留初始值(不让改) 改写属性值 ==增加维度新行== 增加维度新列 使用历史表 举一个具体的 ...

  7. 拉链表(SCD2)的操作

    什么时候使用拉链表? 当数据存在有变更的情况时,可以采用渐变维(SCD)模型来解决.这里推荐使用SCD2拉链 表.拉链表既可以反应数据的历史状态,又能在最大程度上节省存储. 拉链表的实现需要在原始字段 ...

  8. Hive数仓拉链表详解

    文章目录 1. 初始化数据 1.1 建表 1.2 加载数据 1.3 验证同步数据 2. 新增2020-06-21分区数据 3. 加载数据到拉链表 4. 新增2020-06-22分区数据 5. 再次加载 ...

  9. 数据仓库数据模型之:极限存储--历史拉链表

    摘要: 在数据仓库的数据模型设计过程中,经常会遇到文内所提到的这样的需求.而历史拉链表,既能满足对历史数据的需求,又能很大程度的节省存储资源. 在数据仓库的数据模型设计过程中,经常会遇到这样的需求: ...

最新文章

  1. 11.28 软件工程概论psp
  2. iPhone Three20软件引擎之构建开发环境与HelloWorld
  3. Window (Standard IO)
  4. android外接键盘打汉字,Android在外接物理键盘时,如何强制调用系统软键盘
  5. 各种系统程序更新链接
  6. onSaveInstanceState() 和 onRestoreInstanceState()
  7. 机器学习笔记——决策树之回归树
  8. 8.8 Sencha Studio 监视工具( Inspect Tool)
  9. 字符变量赋值规则_第四章 变量
  10. Tips/Tricks#4:不同页面之间传递值
  11. 尝试造了个工具类库,名为 Diana
  12. 手机掌控汽车远程一键启动 预冷预热
  13. 前端开发常用哪些工具软件?
  14. 使用python画二元二次函数(笔记)
  15. 阿里云域名解析详细步骤讲解
  16. html折叠段落标记,HTML 段落标记“p”与换行标记,标题标记“h”!
  17. WinDbg 定位句柄泄漏问题
  18. 0.0.0.0/0是什么意思
  19. 前沿科技赋能教育,掌门优课创新教学体验
  20. UVA(WA) 10815 安迪的第一个字典

热门文章

  1. 友情检测北京某大学网站
  2. Newline required at end of file but not found.
  3. 【算法打卡(二分查找)---7.12】
  4. 破晓博客-自定义标签的开发
  5. java毕业设计摄影服务管理系统服务端mybatis+源码+调试部署+系统+数据库+lw
  6. Qt quick基础2(包含平移旋转放缩以及qml控件大写开头啊)
  7. 在python中、int表示的数据类型是_python--002--数据类型(int、str)
  8. 机器学习(二)-朴素的贝叶斯分类
  9. Typora简单传图(Typora+PicGo-Core+SMMS/阿里云OSS 实现图床)
  10. 六成应用不需要程序员,一大批程序员会失业?