拉链表

上接:SCD缓慢变化维、SCD缓慢变化维问题

拉链表

基础表(业务表):

用户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


原文出处:/show_1IX39k0HHcoX.html