第一篇技术博献给算法?应该算是功能逻辑吧。需求来自内部管理系统,一个需要记录不同用户对同一条数据库进行操作的流程追踪功能。
像这样。
第一步,设计一个单表交易,本文使用的是集成好的Spring MVC框架,只要设计好数据库结构就可以生成基本的交易。一个数据库表就可以用来管理这个追踪过程。
像这样。item_ID是原来的记录主键,trace_ID是追踪记录的主键,user_ID是用户主键,后面的字段含义都比较明显。虽然不知道能不能用上但是还是设计了这个操作编码字段,在判断的时候可能会比较方便,为拓展性考虑再加上4个备用字段。
这个逻辑非常简单,但是在实现的过程中发现了bug。就是一个用户可能会反反复复不断修改记录,如果每次对记录的更新都产生新的流程数据体量就会特别庞大。
像这样。所以需要去记录用户最后的操作时间,在同样的记录,同样的用户,同样的操作时只保留只去更新操作记录的时间,只有在首次操作时才插入一条记录。在实现过程中,trace_ID是框架中的ID产生器自动生成的,在每次获取到用户对这条记录的操作请求时,首先用item_ID(同一条记录),user_ID(同一个用户),operation_Code(同一个操作)三个作为并集查询条件去查询操作记录表,若能查询到记录则表明不是首次操作,更新操作时间即可。若不能则生成trace_ID,插入一条记录。用伪代码实现就是酱。。。
Trace tmp = getTrace(item_ID,user_ID,operation_Code)
if(tmp == null){
insertTrace(new Trace());
}else{
updateTrace();
}
这样实现了以后发现在我的功能需求中完全没有必要。。。因为我的操作种类每一个都有特殊性,不存在用户反反复复去修改的情况,换言之,用户反复修改的信息我们是没有必要记录的,需要记录的只有用户对特定的一个字段的修改,也就是这个包含“审批”、“编辑”、“复核”的状态字段。所以我们重新修改功能逻辑,在收到用户更新记录的请求时,只去判断这个状态字段是否有变化,如果有变化再去添加或更新操作记录表。如果只是修改记录的其他部分则不用理会。
var stateHistory;//修改前的状态
var stateNow;//修改后的状态
if(stateHistory != stateNow){
updateTrace();
}
用伪代码实现就是酱。。。emmm...好像没什么技术含量吼,那就作为开发文档吧~