拉链表

发布时间 2023-05-04 15:05:24作者: 小王同学学编程

一、什么是拉链表

拉链表是一种数据模型,拉链表是针对数据仓库设计中表存储数据的方式而定义的,记录一个事物从开始,一直到当前状态的所有变化的信息;

拉链表可以避免每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式;

拉链表是维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,祛除了一部分不变记录,通过拉链表可以很方便的还原出拉链时点的客户记录;

 

二、用在什么地方

在数据仓库的数据模型设计过程中,经常会遇到这样的需求:

1、数据量比较大;

2、表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;

3、需要查看某一个时间点或者时间段的历史快照信息,比如:查看某一个订单在历史某一个时间点的状态;查看某一个用户在过去某一段时间内,更新过几次等等;

4、变化的比例和频率不是很大,比如,共有1000万的会员,每天新增和发生变化的有10万左右;

5、如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;

拉链历史表,既能满足反应数据的历史状态,又可以最大程度的节省存储;

 

三、拉链表算法

例1:

1、采集当日全量数据到ND(NowDay当日)表;

2、可从历史表中取出昨日全量数据存储到OD(OldDay上日)表;

3、两个表进行全字段比较,(ND-OD)就是当日新增和变化的数据,也就是当天的增量,用w_l表示;

4、两个表进行全字段比较,(OD-ND)为状态到此结束需要封链的数据,需要修改end_date,用w_u表示;

5、将w_l表的内容全部插入到历史表中,这些是新增记录,start_date为当天,而end_date未max值,可以设为‘9999-12-31’;

6、对历史表进行w_u部分的更新操作,start_date保持不变,而end_date改为当天,也就是关链操作,历史表(OD)和w_u表比较,start_date,end_date除外,以w_u表为准,两者交集将其end_date改为当日,说明该记录失效。

 

例2:

1、采集全量数据到ND表;

2、采集昨日增量数据到OD表;

3、两个表进行比较,筛选出ND表与OD表昨日数据相同的id,然后更新ND表id的end_date;

4、将OD表中昨天的数据插入到ND表,end_dat设置为‘9999-12-31’。