@Author : Spinach | GHB
@Link : http://blog.csdn.net/bocai8058
定义
针对数据仓库设计中表存储数据的方式而定义的,即记录历史。
记录一个事物从开始,一直到当前状态的所有变化的信息。
相关概念
记录生命周期
- 数据记录(Record)是对应于数据源中一行信息的一组完整的相关信息;
- 每条记录对应可能有DML操作,例如:update / delete / insert
- Update:在原有的记录上修改某些字段,意味着一条记录死亡,后一条记录新生。
- Delete:删除原有的记录,意味着记录死亡。
- Insert:生成一条新的记录,意味着记录的新生。
所以,任何一条记录(行数据)必定在历史上某天新生(start),
并在其后的某一天死亡(end),
那么这个start-end生存周期便定义为该记录的生命周期。
活跃数据
- 一条数据,在其产生之后直到当天仍然存活的数据,我们称之为活跃数据。
- 针对一条数据的有效时间,数据产生时间已确定,但结束时间并不能被确定。
- 数据标签:start_dt: ‘产生日期’ end_dt: ’_infinity’
死亡数据
- 一条数据,在当天之前某个时间被更改过,我们称之为死亡数据。
- 针对一条数据的有效时间,数据的产生时间和结束时间均已确定。
- 数据标签:start_dt:’产生日期’ end_dt:’结束日期’
实现原理
一般的数据表只会记录当前修改的时间,因此能得到某实体最新的状态快照
name | status | date |
---|---|---|
张三 | 1 | 2020-01-01 |
李四 | 5 | 2020-01-01 |
张三 | 3 | 2020-01-02 |
李四 | 6 | 2020-01-03 |
拉链表巧妙增加了产生(start_date)日期和死亡日期(start_date),用来回溯状态历史快照。
name | status | start_dt | end_dt |
---|---|---|---|
张三 | 1 | 2020-01-01 | 2020-01-01 |
李四 | 5 | 2020-01-01 | 2020-01-02 |
张三 | 3 | 2020-01-02 | _infinity |
李四 | 6 | 2020-01-03 | _infinity |
查询方式及总结
查询方式
Select * from table where start_dt=<‘2020-01-02’ and end_dt>’2020-01-01’
name | status | start_dt | end_dt |
---|---|---|---|
李四 | 5 | 2020-01-01 | 2020-01-02 |
张三 | 3 | 2020-01-02 | _infinity |
Select * from table where end_dt=’_infinity’
name | status | start_dt | end_dt |
---|---|---|---|
张三 | 3 | 2020-01-02 | _infinity |
李四 | 6 | 2020-01-03 | _infinity |
应用条件
- 需要查看某个时间点和时间段的历史快照;
- 有个数据量很大的表;
- 表中的记录变化比例很小;
- 表中的部分字段需要变化;
总结
- 拉链表能满足查看最新快照和历史快照的需求;
- 查询检索性能没有明显提高,但可以将start_dt和end_dt当成分区字段,已提高检索性能;