巧用*_his表记录操作历史

发布时间:2020-08-07 03:52:50 作者:zhuguoli200851
来源:ITPUB博客 阅读:136


文章转载自「开发者圆桌」一个关于开发者入门、进阶、踩坑的微信公众号
巧用*_his表记录操作历史
许多OLTP应用的开发者都知道,一些重要的操作要记录操作历史,把操作前的数据备份到历史表,然后再执行相应的修改操作。这样可以获取某个时点的操作日志和操作前的记录值。


要记录操作历史有两个层面,一个是应用层即通过应用程序逻辑实现历史记录的保存,一个是数据库层即数据库归档、审计等DBA管理的功能。这里仅讨论前者。


比如有一个用户表t_user包含id,name,sex,age字段,因为t_user表的修改非常重要,要记录操作历史,一般的做法是建立和t_user结构相同的一个历史表命名为t_user_his,它包含id,name,sex,age字段,同时添加对应的his_id,oper_time,oper_remark等记录操作说明的字段。


OK,表设计完毕了,我们需要在修改时记录用户之前的信息,一般的做法是先来个insert插入历史表,然后再去修改原表数据,把这两个操作放到同一个事务中去处理,释义代码如下:

setAutoCommit(false);

insert into t_user_his(id,name,sex,age,his_id,oper_time,oper_remark) select id,name,sex,age,'历史表id',timestamp,'修改姓名' from t_user where id=18970;

update t_user set name='xxx' where id=18970;

commit();

部署上线一切运行正常,领导非常满意,突然有一天需要在t_user中添加一个phone字段来记录用户的电话号码,软件产品唯一不变的就是下面这个词

巧用*_his表记录操作历史

没办法只能修改了,需要按照下面几个步骤修改:

首先,修改t_user表添加一个phone字段。

其次,修改t_user_his表添加一个phone字段。

第三,修改涉及到的记录操作历史的SQL,如果有多处也需要一并修改:

setAutoCommit(false);

insert into t_user_his(id,name,sex,age,phone,his_id,oper_time,oper_remark) select id,name,sex,age,phone,'历史表id',timestamp,'修改姓名' from t_user where id=18970;

update t_user set name='xxx' where id=18970;

commit();

最后,编译程序,测试,提交,部署上线,一个流程下来可能要好多天。


问题来了,只能这样处理吗?如何规避字段修改带来的重复修改呢?有没有更好的解决方案呢?答案是肯定的,只需要通过一个简单的修改就可以做到。


我们可以这样来设计t_user_his表的字段,把历史操作相关字段前置,后续字段保持与t_user完全一致,例如t_user_his字段可以这样安排:his_id,oper_time,oper_remark,id,name,sex,age。


应用程序修改如下:

setAutoCommit(false);

insert into t_user_his select ,'历史表id',timestamp,'修改姓名' ,a.* from t_user a  where id=18970;

update t_user set name='xxx' where id=18970;

commit();

这样的话,要添加一个新的phone字段,该如何操作呢?

首先,修改t_user表添加一个phone字段。

其次,修改t_user_his表添加一个phone字段与t_user字段顺序一致。


好了,两步就可以实现字段的自由添加、修改或者删除,不需要修改任何应用程序代码,也不再需要复杂的部署、测试、上线流程,仅在数据库中完成操作就可以了。


上述方法,修改一个字段就要记录整条数据到历史表,会占用较多的空间,要么就把字段写死。具体如何选择还是要分析系统的业务要求,不可盲目照搬。

推荐阅读:
  1. 【使用指南】WijmoJS 前端开发工具包
  2. jquery中的this与$(this)区别

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

his 历史 巧用

上一篇:citus 系列7 - topn 加速(count(*) group by order by count(*) de

下一篇:Windows Server 2008 R2模板机制作(VMware Workstation)

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》