表结构优化的实践

56 阅读3分钟

需求背景

展示OA系统中业务工作流的处理日志。 工作流是一个单独的服务,每个业务系统调用的历史数据有时效性限制。需要把调用记录落库到本地。

数据库表设计

flow_info 记录流程中的每次操作

image.png

node_info 流程节点信息

image.png

具体的业务需求

  1. 流程节点的展示需要根据查询人的权限不同展示的数据不同.例如总经理可以查看全部流程信息,财务部只能查看财务的审批.
  2. 对于终止,回退操作需要打上标签。终止会在终止节点标记终止标签后续节点置灰,回退在回退节点标记回退,被回退节点标记被回退。流程进行中标记,流程完成会加入节点的操作记录里面。
  3. 对于并行流程和子流程作合并展示

第一版代码实现

使用责任链模式,每次从表中查询数据走LogFilter下的实现完成最终数据组装。

LogFilter(interface)
1.LogDataFilter   ---- 数据填充
2.MergeNodeFilter ---- 节点合并 并行流程,子流程
3.TagFilter	---- 标记节点 驳回->被驳回 终止
4.ClearFilter     ---- 清除不需要展示的节点(权限问题,子流程未走)

这种设计有两个问题

  1. 业务中的流程实例很多且复杂节点多,考虑到节点的审批出现驳回操作时,流程从被驳回节点重走。这样一个流程走完需要保存的数据量很多。系统中的业务都很复杂流程节点多,数据量会很快变得巨大。 流程示例: A-B-C-D-E-F-G....Z 流程走到F驳回到C重走,又在Z驳回
  2. 每次展示流程信息,都需要查询所有数据进行数据构建

处理方案

修改表结构,将流程节点放入一个List转成字符串存入context需要注意context字段数据超长。需要减少数据量

  1. 节点的基本数据只需要保存原表中的节点ID,处理人,处理动作,处理时间,处理意见,标记字段。流程节点的基本信息加入缓存。每个List中的节点根据nodeId字段去读取。
  2. 对存入的context数据做压缩处理

image.png 这种只需要在流程节点操作时维护节点的基本信息。流程处理中和流程完成后每次读取Context的数据转成List,数据填充模板。

策略模式处理节点操作
FlowActionStrategy(interface)
实现类
Agree    ----同意操作。新增节点(包含合并节点操作)  
BackToSpecified ----驳回到上指定节点。标记节点
Terminate ----终止节点。加入标记信息清除模板信息中未走分支流程节点数据
End ----流程结束,标记节点清除模板信息中未走分支流程节点数据
现在每次查询都是查库,然后将流程处理信息加入模板,ClearFilter就完成数据组装