浅谈数据仓库存储方式-拉链表
拉链表简述
拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。(百度百科)
拉链表应用场景
1)数据量比较大,变化频率变化比例不高。
2)需要查看某一时间点和时间段的历史快照信息。
3)拉链表适用于存储客户信息、账户信息等数据量大且不常改变的数据信息。
4)既能存储反映历史变化的数据,又能极大的节约数据存储空间。
拉链表加载
步骤1
采集当日全量数据加载到当日临时表中
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | STATUS |
|---|---|---|---|
| 0000001 | 王一 | 王府井大街 | 未发生变化 |
| 0000002 | 李二 | 香榭丽舍大道 | 未发生变化 |
| 0000003 | 张三 | 兰布拉大道 | 当日修改内容 |
| 0000005 | 陈五 | 尼夫斯基大道 | 当日新增记录 |
步骤2
取得昨日全量数据加载到昨日临时表中
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | STATUS |
|---|---|---|---|
| 0000001 | 王一 | 王府井大街 | 未发生变化 |
| 0000002 | 李二 | 香榭丽舍大道 | 未发生变化 |
| 0000003 | 张三 | 南京路 | 当日修改前记录 |
| 0000004 | 刘四 | 威亚多勒罗沙大道 | 当日删除前记录 |
步骤3
当日-昨日数据=当日新增、修改数据,将结果插入到日新增数据表中
相减结果
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | STATUS |
|---|---|---|---|
| 0000003 | 张三 | 兰布拉大道 | 当日修改内容 |
| 0000005 | 陈五 | 尼夫斯基大道 | 当日新增记录 |
步骤4
昨日-当日数据=历史变化数据,将结果插入到待更新数据表中
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | STATUS |
|---|---|---|---|
| 0000003 | 张三 | 南京路 | 当日修改前记录 |
| 0000004 | 刘四 | 威亚多勒罗沙大道 | 当日删除前记录 |
将被修改和被删除的数据与历史表中数据做关联,更新END_DATE为当日日期。
最终结果,当日日期为2020-08-19
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | START_DT | END_DT |
| 1 | 王一 | 王府井大街 | 2011/1/1 | 9999/12/31 |
| 2 | 李二 | 香榭丽舍大道 | 2011/1/1 | 9999/12/31 |
| 3 | 张三 | 南京路 | 2011/1/1 | 2020/8/19 |
| 3 | 张三 | 兰布拉大道 | 2020/8/19 | 9999/12/31 |
| 4 | 刘四 | 威亚多勒罗沙大道 | 2011/1/1 | 2020/8/19 |
| 5 | 陈五 | 尼夫斯基大道 | 2020/8/19 | 9999/12/31 |
查询某日数据
SELECT * FROM TABLE WHERE ${DT_DATE} >= START_DT AND ${DT_DATE} < END_DT
${DT_DATE} = 2020-08-19
| PARTY_ID | PARTY_NAME | ADDRESS_DETAIL | START_DT | END_DT |
| 1 | 王一 | 王府井大街 | 2011/1/1 | 9999/12/31 |
| 2 | 李二 | 香榭丽舍大道 | 2011/1/1 | 9999/12/31 |
| 3 | 张三 | 兰布拉大道 | 2020/8/19 | 9999/12/31 |
| 5 | 陈五 | 尼夫斯基大道 | 2020/8/19 | 9999/12/31 |
作者写的很好~赞同!