拉链表的需求 复制:
1.1 数据量比较大;
1.2 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;
1.3 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态,比如,查看某一个用户在过去某一段时间内,更新过几次等等;
1.4 变化的比例和频率不是很大,比如,总共有1000万的会员,每天新增和发生变化的有10万左右;如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费;
综上所述:引入'拉链历史表',既能满足反应数据的历史状态,又可以最大程度的节省存储;
解释起来就是
《 对目标表中数据既要修改,又要新增,还要保留修改前的旧数据记录,
比如个人信息表,如果数据是新增,就添加进去,如果数据是修改,将旧数据字段修改为失效,即封链,封链日期为当前日期,然后将新数据添加进去,新添加的数据开始日期为当前日期,结束日期设置为很久之后
如果是大的数据量操作
第一步: ins表记录新增和修改的数据,这样就是说,ins表中包括了所有新增的数据和不完全相等的数据,
-- --目标表my_Test不存在的id或者其他字段值不完全相等的行
insert into ins_table select * from tep_table t1 not exists(select 1 from myTest t2 where
t1.id=t2 and t1.name=t2.name and t1.age=t2.age ...
)
第二部:upd表记录目标表中被修改的内容,因为这些内容需要在目标表中删除
-- -- ins表和my_Test表id相等的项,就是需要修改的
insert into upd_table select * from myTest t1 where exists(select 1 from ins_table t2 where t1.id=t2.id)
第三步:删除目标表中被修改项
-- --
delete from my_Test t1 where exists(select 1 from my_Test t2 where t1.id=t2.id);
第四步:将新增修改项INS和被修改项UPD表依次添加进入目标表,新增修改项INS的结束时间为无穷尽,而被修改项表UPD的结束时间为当下
insert into my_Test(id,...,end_time) select id,...,max_time from ins_table;
insert into my_Test(id,...,end_time) select id,...,current_time from upd_table;