拉链表
基础表(业务表):
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 |
拉链表:
| 用户ID | 用户名 | 出生日期 | 住址 | 开始时间 | 结束时间 | 标识位 |
|---|---|---|---|---|---|---|
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 | 2022-01-01 | 2999-12-31 | i |
以 用户ID 作为 主键,可变化字段为:用户名、出生日期、住址
在基础表的基础上,额外增加几个字段,根据设计的不同,会有不同,如下:
- 开始日期starttime,必有
- 结束日期endtime,必有
- 状态标识,可能没有
通过主键(PK)与历史数据进行对比,判断当前数据与历史数据是否发生变化
时间粒度
拉链表的时间粒度,比如:拉链表每天只取一个状态,也就是说如果一天有3个数据变更,我们只取最后一次变更的数据
如果每条修改数据,都保存,就不是拉链表,而是 流水表
第一次加载
因为拉链表历史数据为空,所以所有数据都为 新增数据
标识位:值为i,表示新增状态
开始时间:为数据日期 2021/1/1,当前所有数据都为最新数据
结束时间:一般设置为一个较大的时间2999/12/31
基础表修改数据
第二天,基础表 id是114的记录,出生日期发生变化,如下:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1992-09-08 | 北京市朝阳区 |
拉链表:
| 用户ID | 用户名 | 出生日期 | 住址 | 开始时间 | 结束时间 | 标识位 |
|---|---|---|---|---|---|---|
| 114 | 张三 | 1988-08-08 | 北京市朝阳区 | 2022-01-01 | 2022-01-02 | i |
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 | 2022-01-02 | 2999-12-31 | u |
拉链表中的数据会发生下面变化:
原来id是114的数据,将结束日期修改为变化时间的数据日期
2022-01-02新增id是114的数据,开始时间为变化日期
2022-01-02,结束时间标识为2999/12/31,标识位u,表示这条数据是修改状态
基础表新增数据
第三天,基础表新增一条记录,如下:
| 用户ID | 用户名 | 出生日期 | 住址 |
|---|---|---|---|
| 114 | 张三 | 1992-09-08 | 北京市朝阳区 |
| 115 | 李四 | 1999-01-01 | 上海浦东 |
拉链表:
| 用户ID | 用户名 | 出生日期 | 住址 | 开始时间 | 结束时间 | 标识位 |
|---|---|---|---|---|---|---|
| 114 | 张三 | 1988-08-08 | 北京市朝阳区 | 2022-01-01 | 2022-01-02 | i |
| 114 | 张三 | 1988-09-08 | 北京市朝阳区 | 2022-01-02 | 2999-12-31 | u |
| 115 | 李四 | 1999-01-01 | 上海浦东 | 2022-01-03 | 2999-12-31 | i |
拉链表新增 id是115的数据,开始时间为 2022-01-03,结束时间为 2999/12/31,标识位 i,标为新增
id是114的数据没有发生变化,所以不变
参考:
https://cloud.tencent.com/developer/article/1135904
https://zhuanlan.zhihu.com/p/365371914