需求场景:某些数据表的历史数据会做更新,客户那边做回测需要那个时间段对应的数据。
基本解决方案:
1.数据表中增加字段,记录数据的变动情况(增加数据版本字段),这种解决方案只能解决固定更新次数的数据。
2.利用触发器/CDC(基于sqlServer)捕获变化后固化到固定的表,这样操作的优点是数据完整,可以直接从history表查出来,缺点是触发器会影响数据写入的效率(大批量数据变更的时候还可能引起堵塞);CDC效率比触发器好,但是不能永久的保存数据,需要做固化。这两个方案还有个缺点,就是数据会存在大量的冗余,占用大量的磁盘空间,当源表字段变更的时候History表的字段也要做相应的变更。
3.利用数仓的历史拉链表,记录每一行的生命周期。这个方案的优点是数据冗余会比较小,但是表的结构要做调整。
个人思考:
1.变量:
(1)实现需求;
(2)对表结构的改动最小
(3)效率高
(4)对后面数据的维护流程影响小
(5)占用磁盘空间小
(6)其他问题:真更新/假更新(字段某一列字段变更,增加字段,数据库后台批量操作带来的数据变化,不是真正源数据的变化)
2.实现方式:
(1)我们这边大BOSS给的建议是让开发在前端程序中实现,这样能避免变量6的问题,但是数据入口一定要管严,各个数据入口都要能做到记录数据变化。这样做能减少数据库的维护,避免业务需求下沉到数据实现。
(2)个人认为如果非要用数据来做,可以用历史拉链表的优化方式来做,当然前提也是要区分场景的。
s1.分析/提取数据行经常变化的关键字段
s2.建立子表,存放该关键字段的版本,在表中存放关联KEY、字段值、起始生效时间、结束生效时间。
查询可以通过函数来做,修改字段的时候修改子表即可。这样原表的唯一约束也可以保留不做修改。
个人看法,欢迎拍砖。