数据仓库:拉链表详解
Posted Tunky的实用主义
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据仓库:拉链表详解相关的知识,希望对你有一定的参考价值。
传统拉链表存取:
每日应用系统都提供一个快照(例如银行日切快照),如果每日都存储一个快照,则是极大的存储浪费。比较好的方式是利用拉链存储,每次都只存储数据的增量部分,但是又能恢复任意时刻的快照进行统计分析。
第一日快照,生成第一日拉链表:
每条记录都增加start_date和end_date,start_date统一都是第一日,end_date填写9999-12-31
第二日快照与第一日拉链表,生成第二日拉链表:
第一日拉链表通过start_date<=第一日 and end_date>=第一日,生成第一日快照
第二日快照比第一日快照,把新增数据插入到拉链表,start_date为第二日,end_date为9999-12-31
第二日快照比第一日拉链中end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把拉链表中变化数据中end_date为9999-12-31的修改为“第二日-1”
第二日快照比第一日拉链中end_date为9999-12-31的数据,把第二日快照中的变化数据,插入到拉链表中,start_date=第二日,end_date=9999-12-31
第三日快照与第二日拉链表,生成第三日拉链表:
第二日拉链表通过start_date<=第二日 and end_date>=第二日生成第二日快照
第三日快照比第二日快照,把新增数据插入到拉链表,start_date为第三日,end_date为9999-12-31
第三日快照比第二日拉链中的end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把拉链表中变化数据中end_date为9999-12-31的修改为“第三日-1”
第三日快照比第二日拉链中的end_date为9999-12-31的数据,对比字段值找到拉链表中发生变化的数据,把第三日快照中的变化数据插入到拉链表中,start_date=第三日,end_date=9999-12-31
拉链表数据获取的方式为:
select * from 拉链表 where end_date>=当日, 取最新有效记录
select * from 拉链表 where start_date<=当日 and end_date>=当日, 生成当日的快照
大数据数据仓库拉链表存取:
大数据数据仓库不支持数据修改,因此对于大数据的数仓拉链表来说,生成的逻辑就变成了,利用当日的快照和昨日的拉链表,生成今日的拉链表。
拉链表数据由5部分构成:
1.当日的快照和昨日的拉链表相比,主键新增的数据行
2.当日快照和拉链表最新记录(end_date>=当日)相比,拉链表中有内容更新的数据行
3.当日快照和拉链表最新记录(end_date>=当日)相比,当日快照中有内容更新的数据行
4.拉链表最新记录(end_date>=当日)中,无数据更新的数据行
5.拉链表中历史记录(end_date<当日)的记录
当日的快照和昨日的拉链表进行5次join,然后把各子集的结果union all成一个新的结果集,就是当日拉链表。
用不同的颜色标识不同的拉链数据部分:
第一日快照,生成第一日拉链表:
第二日快照,与第一日拉链表生成第二日拉链表
第三日快照,与第二日拉链表生成第三日拉链表
以上是关于数据仓库:拉链表详解的主要内容,如果未能解决你的问题,请参考以下文章