简介这份PDF文档面向企业信息化建设者、后端开发与数据库设计人员聚焦OA系统中流程审批模块的数据库建模问题帮助读者理清审批流程从发起到归档的完整数据链路。内容围绕流程实例表、活动实例表、审批任务表、规则配置表、历史版本表以及用户与角色权限表展开逐层说明各表字段含义、表间关联关系与状态流转逻辑并讨论如何通过规则配置适配不同企业的个性化审批需求。资源包共1个PDF文件大小约35KB属于轻量级技术文档便于快速通读与查阅。目前已有743人学习下载适合需要搭建或优化审批引擎、梳理表结构映射关系、补充审计与历史追溯设计的开发者参考也可作为数据库课程设计或项目实践中的建模思路素材。1. 从一张审批单的卡顿说起这套数据库设计文档到底解决什么问题如果你维护过任何一套 OA 系统大概率遇到过这种场景一张采购审批单在“部门经理”节点卡了三天发起人催、审批人说没收到、管理员翻日志翻到怀疑人生。最后发现是活动实例表里某个状态字段没更新流程引擎以为任务还挂在上一节点。这类问题的根子往往不在代码而在流程审批数据库的表结构设计。这份《OA系统中流程审批数据库的设计.pdf》讲的正是这件事怎么把流程实例、活动实例、审批任务、规则配置、历史版本、用户权限这几张核心表设计清楚让审批流跑得动、查得到、审得清。它适合正在做 OA 二次开发的后端、需要给企业搭审批中台的架构师以及被“流程走不动”折磨过的运维。文档不是泛泛而谈的概论而是围绕表结构、字段、关系映射展开能直接对照建表。2. 流程实例表与活动实例表审批流的骨架怎么搭2.1 为什么流程实例和活动实例必须拆成两张表很多新手设计审批库时喜欢把“流程走到哪一步”直接塞进一张大表结果流程一多、节点一复杂表里全是重复的业务字段改一个节点要动几十行数据。这份文档明确把流程实例Process Instance和活动实例Activity Instance拆开逻辑上对应“一次审批”和“这次审批里的每一步”。流程实例表管的是“这一单是什么”流程 ID、发起人、开始时间、结束时间、当前状态、关联业务单据号。活动实例表管的是“这一单走到哪了”活动 ID、所属流程实例 ID、活动名称、执行人、开始时间、完成时间。拆开之后流程实例只记录一次活动实例按节点数量增长查询“某单当前卡在谁那”只需要查活动实例表里完成时间为空的那条记录。这种拆法还有一个隐性好处流程回退、跳转、加签时只需要新增或修改活动实例流程实例本身不动历史轨迹天然保留。文档里强调的“状态字段”设计——新建、进行中、已完成、已撤销——是挂在流程实例上的而活动实例的状态更多是“待处理、处理中、已处理”两者不要混用。2.2 建表语句与字段参数说明下面这段 SQL 是按文档思路整理出的核心建表语句字段名和类型可以根据你用的数据库微调但关系结构建议保持一致。-- 流程实例表一次审批对应一条记录 CREATE TABLE oa_process_instance ( process_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 流程实例ID, process_def_key VARCHAR(64) NOT NULL COMMENT 流程定义标识如 leave_approval, business_key VARCHAR(128) COMMENT 关联业务单据号如订单号、合同编号, initiator VARCHAR(64) NOT NULL COMMENT 发起人账号, start_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 开始时间, end_time DATETIME COMMENT 结束时间未结束为NULL, status TINYINT NOT NULL DEFAULT 0 COMMENT 0新建 1进行中 2已完成 3已撤销, current_activity_id BIGINT COMMENT 当前活动实例ID冗余字段加速查询, INDEX idx_business_key (business_key), INDEX idx_initiator_status (initiator, status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT流程实例表; -- 活动实例表流程中的每一个节点对应一条记录 CREATE TABLE oa_activity_instance ( activity_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 活动实例ID, process_id BIGINT NOT NULL COMMENT 所属流程实例ID, activity_name VARCHAR(64) NOT NULL COMMENT 活动名称如部门经理审批, assignee VARCHAR(64) COMMENT 执行人账号, start_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 开始时间, complete_time DATETIME COMMENT 完成时间未完成为NULL, activity_status TINYINT NOT NULL DEFAULT 0 COMMENT 0待处理 1处理中 2已处理, FOREIGN KEY (process_id) REFERENCES oa_process_instance(process_id), INDEX idx_process_status (process_id, activity_status), INDEX idx_assignee_status (assignee, activity_status) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT活动实例表;逻辑上oa_process_instance的current_activity_id是一个冗余字段指向当前待处理的活动实例。这样查“我的待办”时可以直接用assignee activity_status走索引不用每次去关联流程实例表。参数上status用 TINYINT 而不是字符串是为了索引效率business_key加索引方便从业务单据反查审批流。注意current_activity_id在流程跳转时要同步更新否则会出现“流程实例说在进行中活动实例却找不到待处理节点”的经典翻车现场。2.3 活动实例的生成时机与状态流转活动实例不是一次性全部生成而是流程引擎每进入一个节点就插入一条。文档里没有展开讲引擎实现但按常见做法流程启动时先插流程实例再插第一个活动实例审批完成后更新当前活动实例的complete_time和activity_status同时插入下一个节点的活动实例并回写流程实例的current_activity_id。这里有一个容易忽略的点并行网关。如果流程里有两个节点同时进行活动实例表里会有多条process_id相同、complete_time为空的记录。此时流程实例的current_activity_id只能指向其中一个所以更稳妥的做法是查活动实例表来判断待办而不是依赖流程实例的冗余字段。文档里提到的“活动实例表追踪每个步骤执行情况”在并行场景下尤其重要。3. 审批任务表与规则配置表审批逻辑和个性化规则怎么落地3.1 审批任务表记录每一次审批决策活动实例表回答“流程走到哪个节点”审批任务表回答“这个节点上谁批了、批了什么”。文档里把审批任务表定义为存储任务 ID、活动实例 ID、审批人、审批意见、审批结果。实际落地时一个活动实例可能对应多条审批任务比如会签场景下多个审批人各自有一条任务记录。CREATE TABLE oa_approval_task ( task_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 审批任务ID, activity_id BIGINT NOT NULL COMMENT 所属活动实例ID, approver VARCHAR(64) NOT NULL COMMENT 审批人账号, approve_time DATETIME COMMENT 审批时间, approve_comment VARCHAR(512) COMMENT 审批意见, approve_result TINYINT COMMENT 1同意 2拒绝 3退回 4加签, task_status TINYINT NOT NULL DEFAULT 0 COMMENT 0待审批 1已审批, FOREIGN KEY (activity_id) REFERENCES oa_activity_instance(activity_id), INDEX idx_approver_status (approver, task_status), INDEX idx_activity (activity_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT审批任务表;参数上approve_result用 TINYINT 枚举而不是自由文本是为了后续统计“同意率”“退回率”时不用做字符串匹配。approve_comment给 512 长度一般够用如果企业要求长文本意见可以改成 TEXT。task_status和approve_result分开是因为任务可能被撤回或转办状态和结果不是一回事。3.2 规则配置表让审批流适应不同企业文档里提到的规则配置表是这套设计里最容易被低估的部分。没有它每换一个客户就要改代码有了它条件判断和动作定义可以存在数据库里流程引擎运行时读取。CREATE TABLE oa_rule_config ( rule_id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT 规则ID, process_def_key VARCHAR(64) NOT NULL COMMENT 适用的流程定义标识, condition_expr VARCHAR(512) NOT NULL COMMENT 条件表达式如 amount 5000, action_type VARCHAR(32) NOT NULL COMMENT 动作类型如 assign_to_role、skip_node, action_value VARCHAR(256) NOT NULL COMMENT 动作参数如 role_finance_manager, priority INT NOT NULL DEFAULT 100 COMMENT 优先级数字越小越先匹配, enabled TINYINT NOT NULL DEFAULT 1 COMMENT 是否启用, INDEX idx_process_priority (process_def_key, priority) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT规则配置表;常见做法是流程引擎在进入节点前先按process_def_key和priority查出所有启用的规则逐条匹配condition_expr命中后执行action_type。比如“金额大于 5000 时审批人改为财务经理”就是一条assign_to_role动作。condition_expr存的是表达式字符串引擎侧需要一个安全的解析器不要直接用 eval 类函数否则就是黑匣子级别的安全隐患。提示规则配置表的condition_expr建议限制长度并做白名单校验只允许字段名、数字、比较运算符和逻辑运算符避免注入风险。3.3 历史版本表与用户权限表的配合文档还提到历史版本表和用户表、角色权限表。历史版本表不是每改一次流程就全量存一份而是记录流程实例的关键版本信息比如流程定义版本号、变更时间、变更人。这样审计时能回答“这单当时走的是哪版流程”。用户表和角色权限表是审批人解析的基础。审批任务表里存的是approver账号但规则配置表里可能写的是角色。引擎在生成任务时需要根据角色权限表把角色展开成具体用户。这一步如果没做好就会出现“规则配了财务经理但财务经理换人后新经理看不到待办”的问题。常见做法是角色和用户多对多任务生成时快照审批人而不是运行时动态查角色。4. 避坑与排查审批数据库设计里最容易翻车的五件事4.1 现象待办列表查不到任务但数据库里明明有记录原因通常是审批任务表的task_status和活动实例表的activity_status不一致。比如活动实例已经标记为已处理但任务还是待审批或者反过来。解决方式是统一状态流转入口所有状态变更走同一个服务方法并在事务里同时更新两张表。排查时直接对比oa_activity_instance.activity_status和oa_approval_task.task_status不一致的就是脏数据。4.2 现象流程回退后历史审批意见丢失原因在于回退时直接删除了审批任务记录或者覆盖了原活动实例。正确做法是回退不删数据而是新增一条活动实例原活动实例保留并标记为“已退回”。审批任务表也保留原记录新增一条退回任务。这样历史版本表才有东西可查。文档里强调历史记录保存指的就是这种“只增不改”的思路。4.3 现象并行审批时流程提前结束原因是流程实例的current_activity_id只指向一个活动实例当并行分支中一个完成时引擎误判所有分支完成。解决方式是判断流程是否结束时查活动实例表中process_id相同且complete_time为空的记录数而不是看单个字段。如果为 0才把流程实例状态置为已完成。4.4 现象规则配置改了但运行中的流程没生效原因通常是规则在流程启动时就被快照了或者引擎缓存了规则。如果业务要求运行中流程也生效需要在规则配置表加版本号流程实例记录启动时的规则版本引擎每次进入节点时按版本加载。如果不想这么复杂就在规则表加enabled字段改规则时禁用旧规则、新增新规则避免直接 UPDATE。4.5 现象审批人离职后待办任务无人处理原因是审批任务表里存的是具体账号没有做人员状态校验。解决方式是在用户表加status字段任务查询时关联用户表过滤离职人员同时提供管理员转办功能。更稳妥的做法是任务生成时记录审批人所属角色离职后由角色继承人或管理员介入。这个问题在文档里没有展开但实际运维中几乎每个 OA 系统都会遇到。5. 索引、分区与扩展性让审批库扛住三年数据量5.1 索引不是越多越好这三个组合索引最值得建审批库的查询热点很集中查我的待办、查某单的审批轨迹、查某段时间的审批统计。对应到索引文档里提到的“合理使用索引”可以落成三个组合索引。查询场景推荐索引说明我的待办idx_assignee_status (assignee, activity_status)活动实例表覆盖待办过滤某单轨迹idx_process_status (process_id, activity_status)活动实例表按流程实例查节点审批统计idx_approver_status (approver, task_status)审批任务表按人统计任务不要给每个字段都建单列索引写入时会拖慢流程流转。审批任务表的approve_comment这种大字段不要进索引。5.2 历史数据分区按时间还是按流程定义当审批实例超过百万级查询“一年前的审批”会明显变慢。常见做法是按start_time做范围分区每月一个分区。如果企业流程种类少但单流程数据量大也可以按process_def_key做列表分区。分区键一旦选定后续变更成本很高建议在数据量还没起来时就规划好。-- 按月分区的示例MySQL 8.0 ALTER TABLE oa_process_instance PARTITION BY RANGE (YEAR(start_time) * 100 MONTH(start_time)) ( PARTITION p202601 VALUES LESS THAN (202602), PARTITION p202602 VALUES LESS THAN (202603), PARTITION p202603 VALUES LESS THAN (202604) );参数上分区表达式要和查询条件匹配否则分区裁剪失效。如果查询总是带start_time范围按月分区效果好如果查询总是按business_key分区帮不上忙还是得靠索引。5.3 扩展性字段预留与流程定义版本文档最后提到“数据库设计应具备一定扩展性”。落地时我一般会在流程实例表和活动实例表各留一个ext_json字段类型 JSON 或 TEXT用来存不同业务流程的个性化字段。比如请假流程存请假天数采购流程存供应商编号。这样不用为每个流程加列代价是查询这些字段时不能走索引适合展示不适合过滤。流程定义版本也很关键。流程实例表里加process_def_version规则配置表里也加版本号。流程升级时新实例走新版本老实例继续走老版本避免“改流程把在途单改挂”的血泪教训。这个字段在文档里没有明确写但按 OA 系统的实际迭代节奏几乎是必备的。从那以后我每次设计审批库都会先把流程实例、活动实例、审批任务三张表的关系画在白板上确认状态流转只有一条路径再动手建表。希望这份设计文档和上面的落地笔记能帮你少熬几个排查流程卡顿的夜。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
英语-四六级 整体时间规划安排6-5 整理时间规划6-6 写作整理,翻译整理。听力准备。把整体规划准备好6-7 听力加模考。阅读加模考。6-8 花半天时间复习。翻译加模考。6-9 花一天时间复习6-10 学校考试。刷卷子。6-11 通信原理时间复习。刷卷子。… · 2026/9/26 15:06:44
OpenCode 浏览器控制实战:Selenium 复用 Chrome 登录态实现企业批量信息提取 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 15:06:37
Atlas 300V 24G部署YOLO全攻略:从NPU加速卡到CANN推理实践 最近项目上搞了两块Atlas 300V 24G,名字听着熟悉,但真正拆开研究的人不多。它到底是什么?网上总有人搜“atlas部署yolo”,又有一堆人问“atlas 300v 24g 是运算加速卡吗”。今天我直接从自己的部署过程讲起,把它是什么… · 2026/9/26 15:06:37
2025年嵌入式软件开发趋势展望:用TaoToken统一Key打通AI辅助开发工作流 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 16:03:27
Manus AI 教育落地实践:多语言答题卡识别系统的 OCR 与结构解析配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 16:03:27
Atlas 300V 24G实战:YOLO模型转换、部署与性能调优全指南 1. 先弄清楚:Atlas 300V 24G 到底是运算加速卡,还是推理卡?很多朋友第一次接触 Atlas 系列,最纠结的问题就是:这卡到底是干嘛的?能不能用来训模型?跟手里的 RTX 4090 有什么区别?网上… · 2026/9/26 16:03:27
Graphene Relay Node 深度解析:全局对象标识(Global ID)与 Node 根字段实战指南 后端API设计 【免费下载链接】graphene GraphQL framework for Python 项目地址: https://gitcode.com/gh_mirrors/gr/graphene 点击查看 免费下载 relay.Node 是 Graphene 对 Relay 全局对象标识(Global Object Identification)规范的核心实… · 2026/9/26 16:03:27
xberg C 提取 DOCX 公式:OMML 数学转 LaTeX Markdown 的端到端实践 后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with … · 2026/9/26 16:03:21
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46