关于获取数据库表每个时间段快照的思考

需求场景:某些数据表的历史数据会做更新,客户那边做回测需要那个时间段对应的数据。
基本解决方案:
1.数据表中增加字段,记录数据的变动情况(增加数据版本字段),这种解决方案只能解决固定更新次数的数据。
2.利用触发器/CDC(基于sqlServer)捕获变化后固化到固定的表,这样操作的优点是数据完整,可以直接从history表查出来,缺点是触发器会影响数据写入的效率(大批量数据变更的时候还可能引起堵塞);CDC效率比触发器好,但是不能永久的保存数据,需要做固化。这两个方案还有个缺点,就是数据会存在大量的冗余,占用大量的磁盘空间,当源表字段变更的时候History表的字段也要做相应的变更。
3.利用数仓的历史拉链表,记录每一行的生命周期。这个方案的优点是数据冗余会比较小,但是表的结构要做调整。

个人思考:
1.变量:
(1)实现需求;
(2)对表结构的改动最小
(3)效率高
(4)对后面数据的维护流程影响小
(5)占用磁盘空间小
(6)其他问题:真更新/假更新(字段某一列字段变更,增加字段,数据库后台批量操作带来的数据变化,不是真正源数据的变化)

2.实现方式:
(1)我们这边大BOSS给的建议是让开发在前端程序中实现,这样能避免变量6的问题,但是数据入口一定要管严,各个数据入口都要能做到记录数据变化。这样做能减少数据库的维护,避免业务需求下沉到数据实现。
(2)个人认为如果非要用数据来做,可以用历史拉链表的优化方式来做,当然前提也是要区分场景的。
s1.分析/提取数据行经常变化的关键字段
s2.建立子表,存放该关键字段的版本,在表中存放关联KEY、字段值、起始生效时间、结束生效时间。
查询可以通过函数来做,修改字段的时候修改子表即可。这样原表的唯一约束也可以保留不做修改。
个人看法,欢迎拍砖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值