当前位置:   article > 正文

拉链表的实现原理与查询方式_拉链表查询

拉链表查询
@Author  : Spinach | GHB
@Link    : http://blog.csdn.net/bocai8058
  • 1
  • 2

定义

针对数据仓库设计中表存储数据的方式而定义的,即记录历史。

记录一个事物从开始,一直到当前状态的所有变化的信息。

相关概念

记录生命周期
  • 数据记录(Record)是对应于数据源中一行信息的一组完整的相关信息;
  • 每条记录对应可能有DML操作,例如:update / delete / insert
    • Update:在原有的记录上修改某些字段,意味着一条记录死亡,后一条记录新生。
    • Delete:删除原有的记录,意味着记录死亡。
    • Insert:生成一条新的记录,意味着记录的新生。
所以,任何一条记录(行数据)必定在历史上某天新生(start),
并在其后的某一天死亡(end),
那么这个start-end生存周期便定义为该记录的生命周期。
  • 1
  • 2
  • 3
活跃数据
  • 一条数据,在其产生之后直到当天仍然存活的数据,我们称之为活跃数据。
  • 针对一条数据的有效时间,数据产生时间已确定,但结束时间并不能被确定。
  • 数据标签:start_dt: ‘产生日期’ end_dt: ’_infinity’
死亡数据
  • 一条数据,在当天之前某个时间被更改过,我们称之为死亡数据。
  • 针对一条数据的有效时间,数据的产生时间和结束时间均已确定。
  • 数据标签:start_dt:’产生日期’ end_dt:’结束日期’

实现原理

一般的数据表只会记录当前修改的时间,因此能得到某实体最新的状态快照

namestatusdate
张三12020-01-01
李四52020-01-01
张三32020-01-02
李四62020-01-03

拉链表巧妙增加了产生(start_date)日期和死亡日期(start_date),用来回溯状态历史快照。

namestatusstart_dtend_dt
张三12020-01-012020-01-01
李四52020-01-012020-01-02
张三32020-01-02_infinity
李四62020-01-03_infinity

查询方式及总结

查询方式
查询
历史数据查询
最新数据查询
Select * from table where start_dt=<'产生日期' and end_dt>'产生日期'
Select * from table where end_dt='_infinity'

Select * from table where start_dt=<‘2020-01-02’ and end_dt>’2020-01-01’

namestatusstart_dtend_dt
李四52020-01-012020-01-02
张三32020-01-02_infinity

Select * from table where end_dt=’_infinity’

namestatusstart_dtend_dt
张三32020-01-02_infinity
李四62020-01-03_infinity
应用条件
  1. 需要查看某个时间点和时间段的历史快照;
  2. 有个数据量很大的表;
  3. 表中的记录变化比例很小;
  4. 表中的部分字段需要变化;
总结
  1. 拉链表能满足查看最新快照和历史快照的需求;
  2. 查询检索性能没有明显提高,但可以将start_dt和end_dt当成分区字段,已提高检索性能;

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号