拉链表是维护历史状态、以及最新状态的一种方式。
拉链表对快照表进行了优化,根据拉链粒度(一般为时间)的不同,去除了在粒度范围内不变的数据。
拉链表可以维护两个时间(start_time, end_time),来标识当前记录是否还有效,以及更好的定位历史数据
首先要有某一时刻的全量数据,作为起始表
其次要有流水表或者快照表两者其一,作为变化的依据
在数据仓库中,经常会用历史数据和时间维度做数据分析。而保存历史数据最常见的方案是使用拉链表进行存储。
创建测试表(以MySQL为例子)
插入数据
所以2020年5月7日的订单情况如下
第二天订单发生改变
2020年5月8日订单详情
到了2020年5月9日,部分订单再次发生了改变,并且有了新的订单:
5月9日状态:
对于上述表来说,由于没有保存历史数据,因此查询“100001”订单的状态历史就查询不到。如果使用历史拉链表来存储以上信息,则存储内容如下:
历史拉链表中,增加了记录的生命周期开始时间和结束时间,一条记录的生命周期为 [生命周期开始时间,生命周期结束时间)。
将原来的数据导入到历史拉链表,最终结果如下
此时的订单状态
如果需要查询2020年5月8日的历史快照,可以直接写出SQL:
该SQL的查询结果与之前2020-05-08的数据一致: