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

在数据仓库的数据模型设计过程中,经常会遇到这样的需求:
1. 数据量比较大;
2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;
3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
4. 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;
5. 如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;

拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储;

举个简单例子,比如有一张订单表,6月20号有3条记录:

到6月21日,表中有5条记录:

到6月22日,表中有6条记录:

数据仓库中对该表的保留方法:

1. 只保留一份全量,则数据和6月22日的记录一样,如果需要查看6月21日订单001的状态,则无法满足;

2. 每天都保留一份全量,则数据仓库中的该表共有14条记录,但好多记录都是重复保存,没有任何变化,如订单002,004,数据量大了,会造成很大的存储浪费;

如果在数据仓库中设计成历史拉链表保存该表,则会有下面这样一张表:

说明:

1. dw_begin_date表示该条记录的生命周期开始时间,dw_end_date表示该条记录的生命周期结束时间

2. dw_end_date = '9999-12-31'表示该条记录目前处于有效状态;

3. 如果查询当前所有有效的记录,则select * from order_his where dw_end_date = '9999-12-31'

4. 如果查询2012-06-21的历史快照,则select * from order_his where dw_begin_date <= '2012-06-21' and dw_end_date >= '2012-06-21',这条语句会查询到以下记录:

和源表在6月21日的记录完全一致:

拉链表设计

在企业中,由于有些流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此可以使用拉链表的算法来节省存储空间。

1.采集当日全量数据存储到 ND(当日) 表中。 
2.可从历史表中取出昨日全量数据存储到 OD(上日数据)表中。
3.用ND-OD(minus差集)为当日新增和变化的数据(即日增量数据)。

两个表进行全字段比较,将结果记录到tabel_I表中

4.用OD-ND为状态到此结束需要封链的数据。 (需要修改END_DATE)

两个表进行全字段比较,将结果记录到tabel_U表中 
5.历史表(HIS)比ND表和OD表多两个字段(START_DATE,END_DATE) 
6.将tabel_I表的内容全部insert插入到HIS表中。START_DATE='当日',END_DATE可设为'9999-12-31' 
7.更新封链记录的END_DATE

历史表(HIS)和tabel_U表比较,START_DATE,END_DATE除外,以tabel_U表为准,两者交集(INTERSECT)将其END_DATE改成当日,说明该记录失效。 
8。取数据时对日期进行条件选择即可,如:取20100101日的数据为 
(where START_DATE<='20100101' and END_DATE>='20100101' )

union all  并集,并排除重复记录:

union   并集,并包含重复记录

参考文章:

http://www.cnblogs.com/zhangchenliang/archive/2012/09/11/2680945.html

原文链接:

http://www.dataguru.cn/portal.php?mod=view&aid=3272

转载于:https://blog.51cto.com/tianxingzhe/1697844

数据仓库数据模型之:极限存储--历史拉链表相关推荐

  1. hive 分区_Hive下数据仓库历史拉链表如何加工,分区键该如何选择

    缓慢变化维 说到历史拉链表,首先得说下缓慢变化维. 在现实世界中,维度的属性并不是静态的,而是随着时间的变化而变化,这也体现了数据仓库的特点之一,是反映历史变化的.相对于数据增长较为快速的事实表,维度 ...

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

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

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

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

  4. greenplum 历史拉链表

    3.1 历史拉链表 数据仓库定义:是一个面向主题的.集成的.相对稳定的.反映历史变化的数据集合,用于支持管理决策. 历史拉链表:一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的.它记录了 ...

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

    拉链表 拉链表是维护历史状态.以及最新状态的一种方式. 拉链表对快照表进行了优化,根据拉链粒度(一般为时间)的不同,去除了在粒度范围内不变的数据. 拉链表可以维护两个时间(start_time, en ...

  6. hive中实现行转列_漫谈数据仓库之拉链表(原理、设计以及在Hive中的实现)

    全文由下面几个部分组成: 先分享一下拉链表的用途.什么是拉链表. 通过一些小的使用场景来对拉链表做近一步的阐释,以及拉链表和常用的切片表的区别. 举一个具体的应用场景,来设计并实现一份拉链表,最后并通 ...

  7. 数仓潮汐猎人 | 数据仓库企业数仓拉链表制作​

    拉链表 拉链表是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史.记录一个事物从开始,一直到当前状态的所有变化的信息. 下面就是一张拉链表,存储的是用户的最基本信息以及每条 ...

  8. 阿里数据仓库-数据模型建设方法总结(全)

    来源:大数据与机器学习文摘  五分钟学大数据 本文约20000字,建议阅读25分钟 本文介绍了大数据领域建模的方法. 一.大数据领域建模综述 1.1 为什么需要数据建模 有结构地分类组织和存储是我们面 ...

  9. 基于MaxCompute的拉链表设计

    摘要: 简单的拉链表设计 背景信息: 在数据仓库的数据模型设计过程中,经常会遇到这样的需求: 数据量比较大; 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态.手机号码等等; ...

最新文章

  1. java编程游戏飞机旋转问题_用JAVA写的一个飞机游戏
  2. oracle打印乘法口诀,ORACLE中实现输出乘法口诀
  3. 调查:台湾上班族讨厌5种年会状况 最怕老板致词长
  4. array,vector对象 数组越界检测
  5. 第一台计算机豹电器元件,电气基础和安全知识.ppt
  6. python自定义类的属性_我可以将自定义方法/属性添加到内置Python类型吗?
  7. os.path.realpath(__file__) 得到错误路径,与解决方案
  8. Qt C++ QSerialPortInfo的测试
  9. 三维曲线图的绘制方法大全
  10. dp 20190617
  11. Linux驱动开发流程
  12. Google可能退出中国
  13. 有符号整型的数据范围为什么负数比正数多一个
  14. ABP理论学习之EntityFramework集成
  15. python 导入自己写的包
  16. Houdini12:渲染-渲染器SHOP
  17. Windows Server2012搭建Git服务器
  18. PHPWAMP站点管理的“域名模式”和“端口模式”详解、均支持自定义
  19. 《漫步华尔街》 读书笔记 part1 历史
  20. 安卓(java)计算器简单实现

热门文章

  1. 深入浅出PHP(Exploring PHP)
  2. 三个轻量级WebServer--lighttpd,thttpd,shttpd介绍
  3. asp.net 2.0中的弹出对话框
  4. 在C#里实现DATAGRID的打印预览和打印
  5. Hexo Next 博客添加相册瀑布流
  6. 设计模式之观察者模式(Observer)摘录
  7. 【FFmpeg】ffmpeg工具源码分析(一):main函数
  8. java三维滑雪,第六章 三维数据空间分析方法.ppt
  9. html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
  10. xgboost回归预测模型_偏最小二乘回归分析法 从预测角度对所建立的回归模型进行比较...