历史数据解决方案

很多系统会要求记录历史数据,要求可以追朔历史数据,有些甚至要求可以从历史数据中恢复数据。目前做的一个项目,也有这点要求,于是就做了一个实现方案。本方案采用的是关系数据库表记录的方式,要看系统需求,如果确实数据量比较大的话,可以采用NoSql数据库如MangoDB来存储。

方案如下:

1.  系统中每一张表都有一个历史表,要记录所有业务的历史数据,历史表里面是最完整的记录,主表里面是最新有效的数据。

2.  采用生命周期的概念,历史表在主表的基础上添加操作类型(1添加、2修改3删除)、生效时间、失效时间、操作人字段。生效时间和失效时间表示本次操作什么时候生效的,什么时候失效的。

3.  数据添加,主表和历史表都需要插入一份,历史表的操作类型设置为1表示添加,生效时间为当前时间,失效时间为空。

4.  数据修改,首先修改主表中的记录,然后将历史表中该记录对应的失效时间设置为当前时间,然后主表中新修改的记录插入历史表,也就是说修改的数据需要在历史表中是一条新的记录,操作标识设置为2表示修改,生效时间为当前时间,失效时间为空。

5.  数据删除,如果主表中该数据无关联数据,可以将该数据删掉,同时将历史数据表中该记录对应的记录失效时间设置为当前时间,另外再插入历史表一条数据,操作标识设置为3表示删除,生效时间设置为当前时间,失效时间设置为空。

6.  数据查询,平时操作只查询有效数据直接从主表中查询,如果需要查询历史数据或者需要同时查询所有数据包括历史数据,则只从历史表中查询即可,因为历史表里面所有数据都有,是最全的。也可以查询一条记录的所有更新历史记录。

7.  本方案也支持从历史数据恢复数据的操作。


场景示例:查询某段时间内一个公司所有的员工(包括在职的和离职的)

只需要在员工历史表中查询所有创建日期在开始时间内,同时失效日期为空的数据即可,筛选出来的数据即包含了在职员工的最新信息同时也包含了被删除的员工的信息,而且不需要过滤重复记录。(因为所有被修改的数据历史记录的失效时间都是有具体值的,就表示了这类数据只是修改的历史记录,因此这些记录数据会被排除在外。)



你可能感兴趣的:(数据库设计)