Flowable表结构解析:深入理解工作流引擎的数据存储设计

Flowable作为一款强大的开源业务流程管理(BPM)引擎,其数据库表结构设计体现了模块化、高效性和可扩展性。本文将从表命名规则、核心引擎表结构及功能模块表三个方面,全面解析Flowable的数据库表设计。

一、表命名规则与通用结构

Flowable的表名遵循前缀+功能标识+后缀的命名规则,便于快速识别表的用途和所属模块:

  1. 前缀分类

    • ACT_:核心引擎表(如流程引擎、CMMN引擎、DMN引擎)。
    • FLW_:Flowable扩展模块(如Action、Audit、Form等)。
    • FLW_CTRL_:Flowable控制模块相关表。
  2. 功能标识

    • GE_:通用数据,例如ACT_GE_PROPERTY存储引擎配置。
    • RU_(Runtime):运行时数据,仅存储未完成实例,执行完成后删除。
    • HI_(History):历史数据,持久化存储已完成实例。
    • RE_(Repository):静态模型定义,例如流程定义。
  3. 通用后缀

    • DEPLOYMENT:部署记录。
    • DEPLOYMENT_RESOURCE:部署资源,存储模型文件(如BPMN文件)。
    • DEFINITION:定义信息,如流程定义或表单定义。

示例

  • ACT_RU_EXECUTION:记录流程实例的运行时执行路径。
  • ACT_HI_PROCINST:存储已完成的流程实例历史记录。

二、核心引擎表结构

1. 流程引擎(Process Engine)

流程引擎是Flowable的核心,相关表分为运行时表、历史表和模型仓库表。

  • 运行时表(ACT_RU_*)

    • ACT_RU_EXECUTION:流程实例及执行路径。
    • ACT_RU_TASK:未完成的用户任务。
    • ACT_RU_VARIABLE:流程变量。
    • ACT_RU_JOB:异步任务(如定时器)。
  • 历史表(ACT_HI_*)

    • ACT_HI_PROCINST:流程实例历史。
    • ACT_HI_TASKINST:任务执行历史。
    • ACT_HI_ACTINST:活动节点历史。
  • 模型仓库表(ACT_RE_*)

    • ACT_RE_DEPLOYMENT:部署记录。
    • ACT_RE_PROCDEF:流程定义元数据。

2. CMMN引擎(Case Management)

CMMN(案例管理模型和符号)用于处理非结构化流程。

  • 运行时表(ACT_CMMN_RU_*)

    • ACT_CMMN_RU_CASE_INST:未完成的案例实例。
    • ACT_CMMN_RU_PLAN_ITEM_INST:案例计划项实例。
  • 历史表(ACT_CMMN_HI_*)

    • ACT_CMMN_HI_CASE_INST:历史案例实例。
    • ACT_CMMN_HI_MIL_INST:里程碑达成记录。

3. DMN引擎(决策引擎)

DMN(决策模型和符号)用于定义和执行业务规则。

  • ACT_DMN_DECISION_TABLE:决策表元数据。
  • ACT_DMN_HI_DECISION_EXECUTION:决策执行历史。

三、功能模块表结构

1. 表单引擎(Form Engine)

  • FLW_FO_FORM_DEFINITION:表单定义。
  • FLW_FO_FORM_INSTANCE:表单实例数据(例如用户填写的具体表单内容)。

2. 身份管理(Identity Engine)

  • FLW_ID_USER:用户信息。
  • FLW_ID_GROUP:用户组信息。
  • FLW_ID_MEMBERSHIP:用户与组的关系。

3. 内容管理(Content Engine)

  • FLW_CO_CONTENT_ITEM:内容项元数据。
  • FLW_CO_CONTENT_OBJECT:存储二进制内容(如上传的文件)。

4. 审计模块(Audit Engine)

  • FLW_AUDIT_INSTANCE:业务事件审计记录。

5. 服务与策略

  • 服务引擎(Service Engine)
    • FLW_SE_DEFINITION:服务定义(如REST服务配置)。
  • 策略引擎(Policy Engine)
    • FLW_POLICY_DEFINITION:访问策略定义。

四、表关系与性能优化

1. 表关系图

Flowable的表通过关键字段(如PROC_INST_ID_、 TASK_ID_)建立关联。以下是一个简化的表关系示例:

text 复制代码
ACT_RE_PROCDEF (流程定义)
  └── PROC_DEF_ID_ → ACT_RU_EXECUTION (流程实例)
       └── PROC_INST_ID_ → ACT_RU_TASK (任务)
            └── TASK_ID_ → ACT_HI_TASKINST (任务历史)

说明

  • ACT_RE_PROCDEF定义流程模型,部署后生成流程实例存储在ACT_RU_EXECUTION中。
  • 流程实例产生任务,记录在ACT_RU_TASK,完成后归档至ACT_HI_TASKINST。

2. 性能优化建议

  • 索引创建:为高频查询字段(如PROC_INST_ID_、 TASK_ID_)添加索引,提升查询效率。 示例SQL:
sql 复制代码
CREATE INDEX idx_proc_inst_id ON ACT_RU_EXECUTION (PROC_INST_ID_);
  • 数据归档:定期将ACT_HI_*表中的历史数据归档到单独的归档表,减少主表压力。
  • 批量操作:在高并发场景下,使用批量插入和更新,减少数据库交互次数。

与其他BPM引擎的比较

BPM引擎 相似点 差异点 表结构特点
Activiti • 与Flowable共享基础表结构 • 运行时/历史数据分离架构 • 相同的ACT_前缀命名 • 缺少CMMN和DMN支持 • 功能扩展性较弱 • 较少的模块化表设计 • 核心表相同(ACT_RU_, ACT_HI_ ) • 部署和资源管理表结构一致 • 缺少Flowable特有的FLW_前缀表
Camunda • 类似的命名约定(ACT_前缀) • 运行时/历史数据分离 • 基本流程概念相近 • 字段命名和设计有差异 • 增加了特有的CAM_前缀表 • 批处理功能表结构不同 • 更多针对企业级场景优化 • 增强的历史数据表 • 独特的授权和用户任务处理表
jBPM • 流程定义和实例概念 • 运行时/历史数据区分 • 完全不同的表命名规则 • 与Java EE集成的特有表 • 更紧密的Drools规则集成 • JBPM_前缀 • 更扁平化的表结构 • 与Flowable相比表数量更少

与Flowable相比,Activiti作为其前身提供了基础架构,但功能较为基础;Camunda虽有相似表结构,但针对企业级应用进行了更多优化;jBPM则采用完全不同的设计理念,与Drools规则引擎的集成更为紧密。Flowable在继承Activiti基础上,通过增加CMMN、DMN支持和更丰富的扩展模块表结构,提供了更全面的BPM解决方案。

五、实践案例

1. 流程实例存储示例

在一个请假审批流程中:

  • 流程启动后,ACT_RU_EXECUTION记录流程实例ID和当前节点(如"经理审批")。
  • ACT_RU_TASK记录审批任务的详细信息(如任务名称、负责人)。
  • 流程完成后,数据迁移至ACT_HI_PROCINST(流程实例历史)和ACT_HI_TASKINST(任务历史)。

2. 性能瓶颈优化

在高并发场景下,ACT_RU_TASK表的任务查询可能变慢。通过为PROC_INST_ID_和TASK_DEF_KEY_创建复合索引,可显著提升性能:

sql 复制代码
CREATE INDEX idx_task_proc_def ON ACT_RU_TASK (PROC_INST_ID_, TASK_DEF_KEY_);

3. 数据归档实践

对于历史数据量大的系统,可每月执行脚本将ACT_HI_*表的数据迁移至归档表(如ACT_HI_PROCINST_ARCHIVE),保持主表轻量化。

六、数据库脚本与维护

  • 初始化脚本:Flowable提供SQL脚本(如flowable.engine.sql、flowable.work.sql)用于手动建表。
  • 自动更新配置
properties 复制代码
flowable.database-schema-update=true  # 自动校验并更新表结构
flowable.database-schema-update=ignore # 禁用自动管理
  • 升级策略:升级时需按顺序执行脚本,先运行flowable.engine*.sql,再运行flowable.work*.sql。

七、 总结

Flowable通过模块化的表结构设计,将运行时数据(ACT_RU_)与历史数据(ACT_HI_)分离,既满足高性能查询需求,又支持长期审计。其命名规则(如ACT_、FLW_前缀和RU_、HI_标识)使开发者能快速定位数据位置。结合性能优化、实践案例和未来展望,开发者可充分利用Flowable表结构,优化流程性能、扩展功能并高效解决问题。

参考资料

相关推荐
lamdaxu19 分钟前
分布式调用(02)
后端
daiyunchao20 分钟前
让Pomelo支持HTTP协议
后端
芒猿君1 小时前
AQS——同步器框架之源
后端
SaebaRyo1 小时前
手把手教你在网站中启用https和http2
后端·nginx·https
A-Kamen1 小时前
Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实战指南
java·spring boot·后端
豆豆酱1 小时前
Transformer结构详解
后端
upsilon1 小时前
golang切片slice
后端·go
狂奔小菜鸡1 小时前
Java运行时数据区
java·jvm·后端
lovebugs1 小时前
Java并发编程之Lock机制:更灵活的线程同步方案
后端·面试
kunge20131 小时前
Paddle快速入门
后端