Activiti数据库设计

Activiti数据库设计

本章要点
↘ 熟悉Activiti存储表数据结构
↘ 熟悉身份数据表结构
↘ 熟悉运行时数据表结构
↘ 熟悉历史数据表结构
​ 在流程的产生、执行以及结束等周期中,会产生各种与流程相关的数据,Activiti提供了一整套数据表来保存这些数据。Activiti的数据表分5个大部分,每个部分的数据表均有不同的职责。例如运行时数据表,专门用来记录流程运行时所产生的数据;身份数据表用来保存身份数据,包括用户和用户组等。Activiti为这些数据表的命名制定了规范,不同职责的数据表,均可以通过命名来体现。例如运行时数据表,会以ACT_RU作为开头,历史数据表以ACT_HI作为开头。
在了解Activiti之前,本章先对这些数据表的设计做一个大概的描述。通过本章,读者可以了解在流程的不同阶段,数据会保存在哪些表中,以及这些表字段的具体含义。

3.1 通用数据表

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

3.1.1 资源表

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

ACT_GE_BYTEARRAY表包含如下字段。ID_:数据表主键,在MySQL中字段类型为varchar,长度为64。Activiti有自己的主键生成策略,每个数据表的ID_字段值,在整个流程引擎中是唯一的,主键生成策略参见本书的10.4.1节。REV_:数据版本,Activiti为一些有可能会频繁修改的数据表加入该字段,用来标识该数据被操作的次数。NAME_:资源名称,类型为varchar,长度为255。DEPLOYMENT_ID_:一次部署可以添加多个资源,该字段与部署表ACT_RE_DEPLOYMENT的主键相关联。BYTES_:资源内容,数据类型为longblob,最大可存4GB数据。GENERATED_:是否由Activiti自动产生的资源,0表示false,1为true。

3.1.2 属性表

Activiti将全部的属性抽象为key-value对,每个属性都有名称和值,使用ACT_GE_PROPERTY来保存这些属性,该表包含以下字段。NAME_:属性名称,varchar类型,长度为64。VALUE:属性值,varchar类型,长度为300。REV_:数据的版本号。
在初始化流程引擎时,会加入4条属性数据:historyLevel、next.dbid、schema.history和schema.version。这4个默认属性的描述以及作用参见本书10.4.1节。

3.2 流程存储表

流程引擎中使用存储表来保存流程定义和部署信息这类数据,存储表名称以ACT_RE开头,RE是repository单词的前两个字母。

3.2.1 部署数据表

在Activiti中,一次部署可以添加多个资源,资源会被保存到资源表(ACT_GE_BTYEARRAY)中;而部署信息,则保存到部署表中,部署表名为ACT_RE_DEPLOYMENT,其包含以下三个字段。ID_:数据主键,由Activiti按照特定策略产生。NAME_:部署的名称,可以调用Activiti的流程存储API来设置,类型为varchar,长度为255。DEPLOYMENT_TIME_:部署时间,类型为timestamp。
以上三个字段,除了NAME_可以不设置值外,其他字段在数据写入时必须设置值。

3.2.2 流程定义表

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

  • ID_:主键,与其他数据表不同的是,ACT_RE_PROCDEF表的主键是组合主键。一般使用一定的规则来产生主键,产生的规则详情参见本书7.2.1节。
  • REV_:数据版本号。
  • CATEGORY_:流程定义的分类,读取流程XML文件中的targetNamespace值。
  • NAME_:流程定义的名称,读取流程文件中process元素的name值。
  • KEY_:流程定义的key,读取流程文件中process元素的id值。
  • VERSION_:流程定义的版本,如果同一个流程文件被多次部署,那么该版本号就会往上递增,若第一条流程定义的数据为1,那么第二条数据则为2。
  • DEPLOYMENT_ID_:流程定义的对应的部署数据ID。
  • RESOURCE_NAME_:流程定义的对应的资源名称,一般为流程文件的相对路径。DGRM_RERSOURCE_NAME_:流程定义的对应的流程图资源名称。
  • HAS_START_FORM_KEY_:流程文件是否有开始表单,可以在开始事件中使用activiti:formKey属性来配置开始表单。
  • SUSPENSION_STATE_:表示流程定义的状态是激活还是中止,激活状态时该字段值为1,中止后字段值为2。如果流程定义被设置为中止状态,那么将不能启动流程。

3.3 身份数据表

Activiti的整个身份数据模块,可以独立于流程引擎而存在。身份数据表并没有保存流程相关的数据以及关联。身份表名称使用ACT_ID开头,ID是单词identity的前两个字母。

3.3.1 用户表

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

  • ID_:主键,由Activiti来定义生成策略。
  • REV_:数据版本号。
  • FIRST_:名字的名称。
  • LAST_:名字的姓氏。
  • EMAIL_:用户邮箱。
  • PWD_:用户密码。
  • PICTURE_ID_:用户图片,对应资源中的数据ID。FIRST_、LAST_、EMAIL_和PWD_字段均为varchar类型,长度为255。

3.3.2 用户(信息)表

Activiti将用户、用户和用户信息分为三种数据。其中用户表保存用户的数据,而用户和用户信息则被保存到ACT_ID_INFO表中,该表有以下字段。ID_:主键,使用Activiti的主键生成策略产生。REV_:数据版本。

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

3.3.3 用户组表

使用ACT_ID_GROUP表来保存用户组的数据,该表有以下几个字段。ID_:主键,由Activiti的主键生成策略产生。REV_:数据版本号。NAME_:用户组名称。TYPE_:用户组类型,类型不由Activiti提供。但是某些业务中,Activiti会根据该字段的值进行查询,字段值由Activiti定义(如Activiti的WebService)。

3.3.4 关系表

一个用户组下可以有多个用户,同时一个用户也可以属于不同的用户组,那么这种多对多的关系,就使用关系表来进行描述,关系表名为ACT_ID_MEMBERSHIP,只有两个字段。USER_ID_:用户ID,不能为null。GROUP_ID_:用户组ID,不能为null。
需要注意的是,ACT_ID_MEMBERSHIP的两个字段均做了外键约束,写入该表的数据时,必须要有用户和用户组数据与之关联。

3.4 运行时数据表

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

3.4.1 流程实例(执行流)表

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

  • ID_:主键,由Activiti的主键生成策略产生。
  • REV_:数据版本。
  • PROC_INST_ID_:流程实例ID,一个流程实例有可能会产生多个执行流,该字段表示执行流所属的流程实例。
  • BUSINESS_KEY_:启动流程时指定的业务主键。
  • PARENT_ID_:流程实例(执行流)的ID,一个流程实例有可能会产生执行流,新的执行流数据以该字段标识其所属的流程实例。
  • PROC_DEF_ID_:流程定义数据的ID。
  • SUPER_EXEC_:父执行流的ID,一个执行流可以产生新的流程实例,该流程实例数据使用该字段标识其所属的流程实例。
  • ACT_ID_:当前执行流行为的ID,ID在流程文件中定义。
  • IS_ACTIVE_:该执行流是否活跃的标识。
  • IS_CONCURRENT_:执行流是否正在并行。
  • IS_SCOPE_:是否在执行流范围内。
  • IS_EVENT_SCOPE_:是否在事件范围内。
  • SUSPENSION_STATE_:标识流程的中断状态。
  • CACHED_ENT_STATE_:流程实体的缓存,取值为0~7。

3.4.2 流程任务表

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

  • ID_:主键,由Activiti的主键生成策略产生。
  • REV_:数据版本号。
  • EXECUTION_ID_:任务所处的执行流ID。
  • PROC_INST_ID_:对应的流程实例ID。
  • PROC_DEF_ID_:对应流程定义数据的ID。
  • NAME_:任务名称,在流程文件中定义。
  • PARENT_TASK_ID_:父任务ID,子任务才会设置该字段的值。
  • DESCRIPTION_:任务描述,在流程文件中配置。
  • TASK_DEF_KEY_:任务定义的ID值,在流程文件中定义。
  • OWNER_:任务拥有人,没有做外键关联。
  • ASSIGNEE_:被指派执行该任务的人,没有做外键关联。
  • DELEGATION_:任务委托状态,有等候中和已解决两种状态。
  • PRIORITY_:任务优先级,默认为50,类型为int,长度为11。
  • CREATE_TIME_:任务创建时间,类型为timestamp。
  • DUE_DATE_:任务预订日期,类型为datetime。

3.4.3 流程参数表

Activiti提供了ACT_RU_VARIABLE表来存放流程中的参数,这类参数包括流程实例参数、执行流参数和任务参数。参数可以会有多种类型,因此该表有多个字段用来存放参数值。ACT_RU_VARIABLE表有以下字段。ID_:主键,由Activiti的主键生成策略产生。REV_:数据版本号。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类型,长度为4 000。TEXT2_:与TEXT_字段一样,用于保存文本类型的参数值。

3.4.4 流程与身份关系表

用户组和用户之间存在的关系,使用ACT_ID_MEMBERSHIP表保存。用户或者用户组与流程数据之间的关系,则使用ACT_RU_IDENTITYLINK表进行保存。相比于ACT_ID_MEMBERSHIP表,ACT_RU_IDENTITYLINK表的字段更多一些。ID_:主键,由Activiti的主键生成策略产生。

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

3.4.5 工作数据表

在流程执行的过程中,会有一些工作需要定时或者重复执行,这类工作数据被保存到ACT_RU_JOB表中。关于工作的产生情况,可见本书的10.2节。ACT_RU_JOB表有以下字段。

  • ID_:主键,由Activiti的主键生成策略产生。
  • REV_:数据版本号。
  • TYPE_:工作类型,值为message或者timer。
  • LOCK_EXP_TIME_:工作锁定的结束时间。
  • LOCK_OWNER_:工作锁定标识,默认为UUID。EXCLUSIVE_:工作是否需要单独执行。EXECUTION_ID_:产生工作的执行流ID。
  • PROCESS_INSTANCE_ID_:产生工作的流程实例ID。
  • RETRIES_:工作的剩余执行次数,默认值为3。
  • EXCEPTION_STACK_ID_:当任务执行抛出异常时,异常堆栈信息会被保存到资源表中,该ID为关系资源表中存储异常堆栈信息的数据ID。
  • EXCEPTION_MSG_:异常的信息。
  • DUEDATE_:工作执行时间。
  • REPEAT_:工作重复执行的次数。
  • HANDLER_TYPE_:标识工作的处理类。Activiti提供了多个工作处理类用于执行工作,开发人员也可以自定义工作处理类。
  • HANDLER_CFG_:工作的相关配置数据,可以是流程定义的ID,也可以是某个流程行为的ID或者流程事件ID。

3.4.6 事件描述表

如果流程到达某类事件节点,Activiti会往ACT_RU_EVENT_SUBSCR表中加入事件描述数据,这些事件描述数据将会决定流程事件的触发。ACT_RU_EVENT_SUBSCR表有如下字段。ID_:主键,由Activiti主键生成策略产生。REV_:数据版本号。EVENT_TYPE_:事件类型,不同的事件会产生不同类型的事件描述,并不是全部的事件都会产生事件描述。EVENT_NAME_:事件名称,在流程文件中定义。EXECUTION_ID_:事件所在的执行流ID。PROC_INST_ID_:事件所在的流程实例ID。ACTIVITY_ID_:具体事件的ID,在流程文件中定义。CONFIGURATION_:事件的配置属性,该字段有可能存放流程定义ID、执行流ID或者其他数据。CREATED_:事件的创建时间。
关于流程事件更详细的介绍,可以参见第11章。

3.5 历史数据表

历史数据表就像流程引擎的日志表。被操作过的流程元素,将会被记录到历史表中。历史数据表名称以ACT_HI开头,HI是单词history的前两个字母。

3.5.1 流程实例表

流程实例的历史数据会被保存到ACT_HI_PROCINST表中,只要流程被启动,Activiti就会将流程实例的数据写入ACT_HI_PROCINST表中。除了基本的流程字段外,与运行时数据表不同的是,历史流程实例表还会记录流程的开始活动ID、结束活动ID等信息。ACT_HI_PROCINST表有以下几个需要注意的字段。START_ACT_ID_:开始活动的ID,一般是流程开始事件的ID,在流程文件中定义。END_ACT_ID_:流程最后一个活动的ID,一般是流程结束事件的ID,在流程文件中定义。DELETE_REASON_:该流程实例的删除原因,如果流程是正常结束,那么该字段值将会是completed。
该表的其他字段含义与运行时的流程实例表字段类似,在此不再赘述。

3.5.2 流程明细表

流程明细表(ACT_HI_DETAIL)会记录流程执行过程中的参数或者表单数据。由于在流程执行过程中,会产生大量这类数据,因此默认情况下,Activiti不会保存流程明细数据,除非将流程引擎的历史数据(history)配置为full(详情参见本书4.3.1节)。流程的历史明细数据表与运行时参数表的设计类似,在此不再赘述。

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

当流程到达某个任务节点时,就会向历史任务表(ACT_HI_TASKINST)中写入历史任务数据。历史任务表与运行时的任务表设计类似,在运行时任务表的基础上,额外提供了任务开始时间(START_TIME_)、结束时间(END_TIME_)和删除原因(DELETE_REASON_)三个字段。其中开始时间和结束时间字段类型均为datetime,如果任务被正常完成,那么删除原因字段值为completed。
历史行为表(ACT_HI_ACTINST)会记录每一个流程活动的实例,一个流程活动将会被记录为一条数据。例如有一个流程,开始事件、用户任务和结束事件各有一个,当流程结束后,就会产生3条历史行为数据。历史行为表有如下字段。ID_:主键,由Activiti主键生成策略产生。PROC_DEF_ID_:流程定义ID。PROC_INST_ID_:流程实例ID。EXECUTION_ID_:执行流ID。ACT_ID_:流程活动的ID,在流程文件中定义。ACT_NAME_:活动的名称。ACT_TYPE_:活动类型,例如开始事件,活动名称为startEvent。ASSIGNEE_:活动指派人。START_TIME_:活动开始时间,即执行流到达活动时的时间。END_TIME_:活动结束时间,即执行流离开该活动时的时间。DURATION_:活动持续时间,单位为毫秒。

3.5.4 附件表和评论表

使用任务服务(TaskService)的API,可以添加附件和评论,这些附件和评论的数据将会保存到ACT_HI_ATTACHMENT表和ACT_HI_COMMENT表中,ACT_HI_ATTACHMENT表有如下字段。ID_:主键,由Activiti的主键生成策略产生。REV_:数据版本号。USER_ID_:附件对应的用户ID,可以为null。NAME_:附件名称。DESCRIPTION_:附件描述。TYPE_:附件类型。TASK_ID_:该附件对应的任务ID。PROC_INST_ID_:对应的流程实例ID。URL_:连接到该附件的URL。CONTENT_ID_:附件内容ID,附件的内容将会被保存到资源表中,该字段记录资源数据ID。

ACT_HI_COMMENT表实际不只保存评论数据,它还会保存某些事件数据,但它的表名为COMMENT,因此更倾向把它叫作评论表,该表有如下字段。ID_:主键,由Activiti的主键生成策略产生。TYPE_:评论的类型,可以设置为event或者comment,表示事件记录数据或者评论数据。TIME_:数据产生的时间。USER_ID_:产生评论数据的用户ID。TASK_ID_:该评论数据的任务ID。PROC_INST_ID_:数据对应的流程实例ID。ACTION_:该评论数据的操作标识。MESSAGE_:该评论数据的信息。FULL_MSG_:该字段同样记录评论数据的信息。
虽然附件表和评论表的命名遵守历史数据表的命名规范(以ACT_HI开头),但是可以调用其他服务组件的API来往这两个表中写入数据,以笔者的理解,历史数据表实际上保存的是那种一经写入,就很少会发生变化(结构性变化)的数据。

3.6 本章小结

本章对Activiti全部的数据表做了一个简单的介绍,包括Activiti数据表的几大分类以及这些分类的作用,还讲述了每一个数据表中的字段及其含义。本章对这些字段只是做了简单的讲解,让读者对流程引擎的数据库有一个大概的了解,在后面的章节中,讲述每一个具体知识点的时候,都会或多或少涉及数据库的操作以及变化。

转载自:电子书,《疯狂Workflow讲义》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值