拉链表的应用

拉链表的需求  复制:

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; 

   

你可能感兴趣的:(oracle,java,dba)