1. 拉链表简介
拉链,通俗来讲即打开和关闭数据,设计表的时候添加 START_DATE 和 END_DATE 两个字段,数据更新时,通过修改 END_DATE 来设置数据的有效时间。
数据的拉链表只存一份全量数据,其余都是增量数据,查询时使用 START_DATE 和 END_DATE 作为约束条件来筛选某日的数据快照。同时可以节省存储空间,记录历史变化。
关键词:OD(历史数据)、ND(当日数据)、ND-OD(日增量数据)、OD-ND 为状态到此结束需要封链的数据
2. 拉链表适用场景
在银行、电商等企业中,由于每日流水表每日有几千万条记录,数据仓库保存5年数据的话很容易不堪重负,因此使用拉链表的算法来节省存储空间。
另外,工作中如果需要对接数据,数据量大而且要保留快照,不能删除,拉链表也是一个不错的选择,比给数据记录上标识高效很多。
3. 拉链表Demo
(1) 初始数据时,START_DATE 为生命周期开始时间,END_DATE 为生命周期结束时间,默认设置为为最大日期 9999-12-31。
2019-03-19 日首次导入全量数据
2000088956694021 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694047 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694062 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694088 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2019-03-20 日导入增量数据
2000088956694021 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-03-19 00:00:00 |
2000088956694021 | 200 | 9999999999 | 逾期 | 2019-03-20 00:00:00 | 9999-12-31 00:00:00 |
2000088956694047 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694062 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694088 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:0 |
2019-03-21 日导入增量数据
2000088956694021 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 2019-03-19 00:00:00 |
2000088956694021 | 200 | 9999999999 | 逾期 | 2019-03-20 00:00:00 | 2019-03-20 00:00:00 |
2000088956694021 | 100 | 9999999999 | 逾期 | 2019-03-21 00:00:00 | 9999-12-31 00:00:00 |
2000088956694047 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694062 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
2000088956694088 | 300 | 9999999999 | 逾期 | 2019-03-19 00:00:00 | 9999-12-31 00:00:00 |
这样的历史拉链表可以不用删除历史数据,只要每天将新增的数据insert,有状态更新的账户update即可,既能满足对历史数据的需求,又能很大程度的节省存储资源。同时对于日增几百万的数据也能很好的处理;
注意: 拉链的实际操作语句可以自己网上找资源理解,原理很简单:先关链 -> 再开链
(2) 查询历史快照
(查询2019-03-19 日导入数据的历史快照):
SELECT * FROM `source_account_zipper` t where t.START_DATE<='2019-03-19' and t.END_DATE>='2019-03-19'
(查询2019-03-20 日导入数据的历史快照):
SELECT * FROM `source_account_zipper` t where t.START_DATE<='2019-03-20' and t.END_DATE>='2019-03-20'
(查询2019-03-21 日导入数据的历史快照):
SELECT * FROM `source_account_zipper` t where t.START_DATE<='2019-03-21' and t.END_DATE>='2019-03-21'
拉链的DDL语句将在下一篇博客更新。。。,敬请期待!!!