条件分支流程图 数据库表如何设计?
2025-04-02 本文已影响0人
饱饱抓住了灵感
设计数据库表保存条件分支流程图时,需结合流程图的节点和逻辑关系。
一、核心表设计
1. 流程图表 (flowcharts)
存储流程图基本信息
CREATE TABLE flowcharts (
id INT PRIMARY KEY AUTO_INCREMENT, -- 流程图唯一ID
name VARCHAR(255) NOT NULL, -- 流程图名称
description TEXT, -- 描述
creator_id INT, -- 创建者ID(可关联用户表)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2. 节点表 (nodes)
存储流程中的具体节点(开始、操作、判断、结束等)
CREATE TABLE nodes (
id INT PRIMARY KEY AUTO_INCREMENT,
flowchart_id INT NOT NULL, -- 所属流程图ID
type ENUM('start', 'action', 'decision', 'end') NOT NULL, -- 节点类型
name VARCHAR(255) NOT NULL, -- 节点名称
content TEXT, -- 节点内容(如操作描述、判断条件提示)
position_x INT, -- 可视化布局X坐标
position_y INT, -- 可视化布局Y坐标
FOREIGN KEY (flowchart_id) REFERENCES flowcharts(id)
);
3. 转移关系表 (transitions)
存储节点间的跳转逻辑(含条件)
CREATE TABLE transitions (
id INT PRIMARY KEY AUTO_INCREMENT,
from_node_id INT NOT NULL, -- 源节点ID
to_node_id INT NOT NULL, -- 目标节点ID
condition_expression TEXT, -- 条件表达式(如 "age > 18")
is_default BOOLEAN DEFAULT FALSE, -- 是否为默认分支(无条件时触发)
sequence INT, -- 同源节点下的执行顺序
FOREIGN KEY (from_node_id) REFERENCES nodes(id),
FOREIGN KEY (to_node_id) REFERENCES nodes(id)
);
二、设计要点说明
-
节点类型区分
-
decision类型节点支持多分支(多个transitions),action/start/end为单出口。 - 示例:判断节点有两条转移(
age>18→ 流程A,age<=18→ 流程B)。
-
-
条件表达式存储
- 直接存储表达式字符串(如
"status == 'approved'"),业务层解析执行。 - 复杂场景可扩展为存储JSON格式条件组(如
{"operator": "AND", "conditions": [...]})。
- 直接存储表达式字符串(如
-
可视化布局
-
position_x/y字段支持流程图绘制时的坐标还原。
-
-
默认分支处理
- 当无明确条件匹配时,通过
is_default=TRUE标识默认跳转路径。
- 当无明确条件匹配时,通过
三、示例数据
流程图:请假审批
-- 插入流程图
INSERT INTO flowcharts (name) VALUES ('Leave Approval');
-- 插入节点(ID假设自增)
-- 开始节点
INSERT INTO nodes (flowchart_id, type, name, content)
VALUES (1, 'start', 'Start', '流程启动');
-- 判断节点(ID=2)
INSERT INTO nodes (flowchart_id, type, name, content)
VALUES (1, 'decision', 'Check Days', '请假天数是否超过3天?');
-- 结束节点(ID=3, ID=4)
INSERT INTO nodes (flowchart_id, type, name, content)
VALUES (1, 'end', 'Approved', '审批通过'),
(1, 'end', 'Rejected', '审批拒绝');
-- 插入转移关系
-- 开始→判断节点
INSERT INTO transitions (from_node_id, to_node_id)
VALUES (1, 2);
-- 判断节点→结束节点(条件分支)
INSERT INTO transitions (from_node_id, to_node_id, condition_expression)
VALUES (2, 3, 'days > 3'),
(2, 4, 'days <= 3');
四、扩展性建议
-
动态属性
若节点需存储额外参数(如超时时间),可通过JSON类型扩展:ALTER TABLE nodes ADD COLUMN attributes JSON; -- 示例:{"timeout": 72, "unit": "hours"} -
版本控制
如需保留历史版本,可新增versions表记录每次修改。 -
权限管理
添加acl表关联角色与流程图访问权限。
此设计平衡了通用性与性能,可根据实际业务需求调整字段类型或增加约束。