德玛西亚之WorkFlow(四)数据库设计

在流程的产生、执行及结束等周期,都会产生各种与流程相关的数据, Activiti 提供了一整套数据表来保存这些数据。 Activiti 流程引擎的数据表分 大类,每 类的数据表均有不同的职责 例如运行时数据表,专门用来记录流程运行时所产生的数据:身份数据表专门保存身份数据,包括用户、用户组等 Activiti 为这些数据表的命名制定了规范,不同职责的数据表,均可以通过命名来体现 例如运行时数据表,会以 ACT RU 作为开头:历史数据表以 ACT HI 作为开头。

1 通用数据表

通用数据表用于存放一些通用的数据,这些表本身不关心特定的流程或者业务,只用于存放这些业务或者流程所使用的通用资源。它们可以独立存在于流程引擎或者应用系统中,其他的数据表有可能会使用这些表中的数据。通用数据表有两个,它们都以“ACT GE 开头,GE 是单词 general 的缩写。

1.1 资源表

表 ACT_GE_BYTEARRAY 用于保存与流程引擎相关的资源,只要调用了 Activiti 存储服务的 API ,涉及的资源均会被转换为 byte 数组保存到这个表中。在资源表中设计了一个 BYTES宇段,用来保存资源的内容,因此理论上其可以用于保存任何类型的资源(文件或者其他来源的输入流)。一般情况下, Activiti 使用这个表来保存字符串、流程文件的内容、流程图片内容。ACT GE BYTEARRAY 表主要包含如下字段。

REV_ :数据版本, Activiti为一些有可能会被频繁修改的数据表,加入该字段,用来表示该数据被操作的次数。
NAME_ :资源名称,类型为 varchar ,长度为 255 字节。
DEPLOYMENT_ID_ :一次由曙可以励口多个资源,该字段与剖曙表ACT_RE_DEPLOYMENT的主键相关联。BYTES_ :资源内容,数据类型为 longblob ,最大可存 4GB 数据。
GENERATED_:是否由 Activiti 自动产生的资源, 0表示 false, 1为true。

1.2 属性表

Activiti 将全部的属性抽象为 key-value 对,每个属性都有名称和值, 使用ACT_GE_PROPERTY 来保存这些属性,该表有以下 个字段。

NAME_ :属性名称, varchar 类型。
VALUE_ :属性值, varchar 类型。
REV_ :数据的版本号。

2 部署数据表

流程引擎使用仓储表来保存流程定义和部署信息这类数据,存储表名称以“ACT RE ”开头,“RE”是 repository单词的缩写。

2.1 部署数据表

在 Activiti 中,一次部署可以添加多个资源,资源会保存到资源表中,而对于部署,则部署信息会被保存到部署表中,部署表名称为 ACT_RE_DEPLOYMENT,该表主要包含以下字段。

NAME_ :部署的名称,可以调用 Activiti 的流程存储 API 来设置,类型为 varchar,长度为 255 字节。DEPLOY_TIME_ :部署时间,类型为 timestamp。

以上 段,除了 NAME 可以不设置值外 其他宇段在数据写入时必须设置值。

2.2 流程定义表

Activiti 在部署添加资源时,如果发布部署的文件是流程文件( .bprnn 或者.BPMN 20.xml),则除了会解析这些流程文件,将内容保存到资源表外,还会解析流程文件的内容,形成特定的流程定义数据,写入流程定义表( ACT_RE_PROCDEF )中 ACT_RE_PROCDEF 表主要包含以下字段。

CATEGORY_ :流程定义的分类,读取流程 XML 文件中的 targetNamespace 值。
NAME_ :流程定义名称,读取流程文件中 process 元素的 name 属性。
KEY_ :流程定义的 key 读取流程文件中 process 元素的 id 属性。
DEPLOYMENT_ID_ :流程定义对应的部署数据ID。
RESOURCE_NAME_ :流程定义对应的资源名称,一般为流程文件的相对路径。
DGRM_RESOURCE_NAME_ :流程定义对应的流程图资源名称。
SUSPENSION_STATE_:表示流程定义的状态是激活还是中止,激活状态时该字段值为1,中止时宇段值为2,如果流程定义被设置为中止状态,那么将不能启动流程。

3 身份数据表

Activiti 的整个身份数据模块,可以独立于流程引擎而存在,有关身份数据的几张表,并没有保存与流程相关的数据及关联。身份表名称以 ACT_ID 开头,表名中的"ID"是单词 identity的缩写。

3.1 用户表

流程引擎用户的信息被保存在 ACT_ID_USER 表中,该表有以下几个字段。

FIRST_ :人名。
LAST_ :姓氏。
EMAIL_ :用户邮箱。
PWD_ :用户密码。
PICTURE_ID_:用户图片,对应资源中的数据ID。

3.2 用户账号(信息)表

Activiti 将用户、用户账号和用户信息分为三种数据,其中用户表保存用户的数据,而用户账号和用户信息,则被保存到 ACT_ID_INFO 表中,该表有以下字段。

USER_ID_ :对应用户表的数据 ID,但没有强制做外键关联。
TYPE_ :信息类型,当前可以设置用户账号 (account )、用户信息 (userinfo )和 NULL 三种值。
KEY_ :数据的键,可以根据该键来查找用户信息的值。
VALUE_ :数据的值,类型为 varchar ,长度为 255 宇节。
PASSWORD_ :用户账号的密码字段,不过当前版本的 Activiti 井没有使用该字段。
PARENT_ID_ :该信息的父信息 ID,如果一条数据设置了父信息 ID,则表示该数据是用户账号(信息)的明细数据,例如一个账号有激活日期,那么激活日期就是该账号的明细数据,此处使用了自关联来实现。

3.3 用户组表

使用 ACT_ID_GROUP 表来保存用户组的数据,该表有以下几个字段。

NAME_:用户组名称。_
TYPE:用户组类型,类型不由此 Activiti 提供,但是在某些业务中, Activiti 会根据该字段的值进行查询,字段值由 Activiti 定义(如 Activiti 的 WebService)。

3.4 关系表

一个用户组下有多个用户, 一个用户可以属于不同的用户组,那么这种多对多的关系,就使用关系表来进行描述,关系表为 ACT_ID_MEMBERSHIP ,只有两个字段。

USER_ID_ :用户 ID,不能为 NULL。
GROUP_ID_ :用户组 ID,不能为 NULL。

需要注意的是, ACT_ID_ MEMBERSHIP 的两个字段均做了外键约束 写入该表的数据,必须要有用户和用户组数据与之关联。

4 运行时数据表

运行时数据表用来保存流程在运行过程中所产生的数据,例如流程实例、执行流、任务等。运行时数据表的名称以 ACT_RU 开头,“RU ”是单词 runtime 的缩写。

4.1 流程实例(执行流)表

流程启动后,会产生一个流程实例,同时会产生相应的执行流,流程实例和执行流数据均被保存在 ACT_RU_EXECUTION 表中,如果一个流程实例只有一条执行流,那么该表中也会产生两条数据,一条数据表示执行流,另一条表示流程实例。 ACT_RU_EXECUTION 表有以下字段.

PROC_INST_ID_ :流程实例 ID,一个流程实例有可能会产生多个执行流,该字段表示执行流所属的流程实例
BUSINESS_KEY_ : 启动流程时指定的业务主键。
PROC_DEF_ID_ :流程定义数据的 ID。
ACT_ID
:当前执行流行为的 ID, ID 在流程文件中定义。
IS_ACTIVE_ :该执行流是否活跃的标识。
IS_CONCURRENT_ :执行流是否正在并行。
SUSPENSION_STATE_ :标识流程的中断状态。

4.2 流程任务表

流程在运行过程中所产生的任务数据保存在 ACT_RU_TASK 表中,该表主要有如下字段。

EXECUTION_ID_ :任务所在的执行流 ID。
PROC_INST_ID_ :对应的流程实例 ID。
PROC_DEF_ID_ :对应流程定义数据的 ID。
NAME_ :任务名称,在流程文件中定义。
DESCRIPTION_ :任务描述,在流程文件中配置。
TASK_DEF_KEY_ :任务定义的 ID 值,在流程文件中定义。
OWNER_ :任务拥有人,没有做外键关联。
ASSIGNEE_ :被指派执行该任务的人,没有做外键关联。
PRIORITY_ : 任务优先级数值。
DUE_DATE_ :任务预订日期,类型为 datetime。

4.3 流程参数表

Activiti 提供了 ACT_RU_VARIABLE 表来存放流程中的参数,这类参数包括流程实例参数、执行流参数和任务参数,参数有可能会有多种类型,因此该表使用多个字段来存放参数值ACT_RU_VARIABLE 表主要有以下字段。

TYPE_ :参数类型,该字段值可以为“boolean"、“bytes"、“serializable"、“date"、“double"、“integer"、“jpa-entity"、“long “、“null”、“short"、“string",这些字段值均为 Activiti 提供,还可以通过扩展来自定义参数类型。
NAME_ :参数名称。
EXECUTION_ID_ :该参数对应的执行 ID,可以为 null。
PROC_INST_ID_ :该参数对应的流程实例 ID,可以为 null。
TASK_ID_ :如果该参数是任务参数,就需要设置任务 ID。
BYTEARRAY_ID_ :如果参数值是序列化对象,那么可以将该对象作为资源保存到资源表中,该字段保存资源表中数据的 ID。
DOUBLE_ :参数类型为 double 的话,则值会保存到该字段中。
LONG_ :参数类型为 long 的话,则值会保存到该宇段中。
TEXT_ :用于保存文本类型的参数值,该字段为 varchar 类型,长度为 4000 字节。
TEXT2_ :与 TEXT 宇段一样,用于保存文本类型的参数值。

4.4 流程与身份关系表

用户组和用户之间的关系,使用 ACT_ID_MEMBERSHIP 表保存,用户或者用户组与流程数据之间的关系,则使用 ACT_RU_IDENTITYLINK 表进行保存,相比于 ACT_ID_MEMBERSHIP 表, ACT_RU_IDENTITYLINK 表的宇段更多一些。

GROUP_ID_ :该关系数据中的用户组 ID。
TYPE_ :该关系数据的类型,当前提供了 个值 assignee、candidate和owner 表示流程数据的指派人(组〉、候选人(组)和拥有人。
USER_ID_ :关系数据中的用户 ID。
TASK_ID_ :关系数据中的任务 ID。
PROC_INST_ID_ :关系数据中的流程实例 ID。
PROC_DEF_ID_:关系数据中的流程定义 ID。

4.5 工作数据表

在流程执行的过程中,会有一些工作需要定时或者重复执行,这类工作数据被保存到工作表中, Activiti 提供了四个工作表用于保存不同的工作数据。

ACT_RU_JOB :一般工作表。

ACT_RU_DEADLETTER_JOB :无法执行工作表,用于存放无法执行的工作。

ACT_RU_SUSPENDED_JOB :中断工作表,中断工作产生后,会将工作保存到该表中。

ACT_RU_TIMER_JOB :定时器工作表,用于存放定时器工作。

4.6 事件描述表

如果流程到达某类事件节点, Activiti 会往 ACT_RU_EVENT_SUBSCR 表中加入事件描述数据,这些事件描述数据将会决定流程事件的触发。 ACT_RU_EVENT_SUBSCR 表有如下字段。

EVENT_TYPE_ :事件类型,不同的事件会产生不同类型的事件描述,并不是所有的事件都会产生事件描述。
EVENT_NAME_ :事件名称,在流程文件中定义。
EXECUTION_ID_ :事件所在的执行流 ID。
PROC_INST_ID_ :事件所在的流程实例 ID。
ACTIVITY_ID_ :具体事件的 ID,在流程文件中定义。
CONFIGURATION_ :事件的配置属性,该宇段中有可能存放流程定义 ID、执行流 ID或者其他数据。

5 历史数据表

历史数据表就好像流程引擎的日志表,操作过的流程元素将会被记录到历史表中。历史数据表名称以 ACT_HI 开头,“HI”是单词 history 缩写。

5.1 流程实例表

流程实例的历史数据会被保存到 ACT_HI_PROCINST 表中,只要流程被启动,就会将流程实例的数据写入 ACT_HI_PROCINST 表中 。除了基本的流程字段外,与运行时数据表不同的是,历史流程实例表还会记录流程的开始活动 ID 、结束活动 ID等信息 ACT_HI_PROCINST 表有以下三个主要的字段。

START_ACT_ID_ :开始活动的 ID 一般是流程开始事件的 ID,在流程文件中定义。
END_ACT_ID_ :流程最后一个活动的 ID,一般是流程结束事件的 ID,在流程文件中定义。
DELETE_REASON_ :该流程实例被删除的原因。

该表的其他字段含义与运行时的流程实例表宇段类似,在此不再赘述。

5.2 流程明细表

流程明细表(ACT_HI_DETAlL) 会记录流程执行过程中的参数或者表单数据,由于在流程执行过程中,会产生大量这类数据,因此默认情况下, Activiti 不会保存流程明细数据,除非将流程引擎的历史数据( history〉配置为 full。

5.3 历史任务表和历史行为表

当流程到达某个任务节点时,就会向历史任务表(ACT_HI_TASKINST )中写入历史任务数据,该表与运行时的任务表类似。历史行为表(AC_HI_ACT_AXTINST) 会记录每一个流程活动的实例,一个流程活动将会被记录为一条数据,根据该表可以追踪最完整的流程信息。

5.4 附件表和评论表

使用任务服务(TaskService )的 API ,可以添加附件和评论,这些附件和评论的数据将会被保存到 ACT_HI_ATTACHMENT和ACT_HI_COMMENT表中。 ACT_HI_ATTACHMENT 如下字段。

USER_ID_ :附件对应的用户 ID,可以为 NULL。
NAME_ :附件名称。
DESCRIPTION_ :附件描述。
TYPE_ :附件类型。
TASK_ID_ :该附件对应的任务 ID。
PROC_INST_ID_ :对应的流程实例 ID。
URL_ :连接到该附件的 URL。
CONTENT_ID_ :附件内容 ID,附件的内容将会被保存到资源表中,该字段记录资源数据 ID。

ACT_HI_COMMENT 表实际不只保存评论数据,它还会保存某些事件数据,但它的表名为COMMENT ,因此更倾向把它叫作评论表,该表有如下字段。

TYPE_ :评论的类型,可以设值为“event ”或者“ comment ”,表示事件记录数据或者评论数据。
TIME_ :数据产生的时间。
USER_ID_ :产生评论数据的用户 ID。
TASK_ID_ :该评论数据的任务 ID。
PROC_INST_ID_ :数据对应的流程实例 ID。
ACTION_ :该评论数据的操作标识。
MESSAGE_ :该评论数据的信息。
FULL_MSG_ :该字段同样记录评论数据的信息。

虽然附件表和评论表的命名遵守历史数据表的命名规范(以 ACT_HI 开头),但是可以调用其他服务组件的 API 来往这两个表中写入数据,以笔者的理解,历史数据表实际上保存的是那种一经写入,就很少会发生变化(结构性变化)的数据。

6 DMN规则 (待补充)

Activiti 6.0 中加入了基于 DMN 规范的规则引擎模块,当前版本主要有 个数据表,保存规则引擎相关的数据。

6.1 决策部署表

保存决策数据,类似于流程定义部署,每一次部署,可以添加多份决策文件,向部署表中写入一条部署数据,对应数据表为 ACT_DMN_DEPLOYMENT 该表主要有以下字段。