两种方式
trigger
这个方式最好配合表继承来处理,创建一个父表主要是定义表结构,不存数据。然后创建业务表和snapshot表都继承该父表。然后创建触发器在insert和update后把数据刷入snapshot(为什么要后置触发呢,这样保证在snapshot可以看到整个生命周期)。这里有一个坑,就是如果业务表继承了其他的表,那么修改业务表的业务父表的表结构时需要注意。另外需要注意的是snapshot表的id不再唯一
json
另一个种做法就是把整个记录作为json存在一个snapshot表,这个snapshot表可以多个对象共享。
因为json一般也不会去关联查询(用历史数据join现在的记录会有点怪)
如果业务记录本身就是json这样最妙
是否还需要业务表
答案恐怕是需要
是否同步创建
如果是trigger肯定是同步创建。对于json,一个方案是在写业务表时同时写snapshot表,使用数据库的事务来控制(写业务表本身恐怕就有事务)。另一个方案是把snapshot拿出来,这样做的一个好处是可以把snapshot和业务表放在不同数据库,甚至snapshot可以按照业务的逻辑id来管理
外键关联
是关联业务表的id还是snapshot的id肯定是根据业务要求来。但是记录了snapshot_id后是否还需要id呢?恐怕是需要的,一方面是为了性能,另一方面减少耦合。
需要注意的坑
手工改数据可能导致不一致