条件分支流程图 数据库表如何设计?

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)
);

二、设计要点说明

  1. 节点类型区分
    • decision 类型节点支持多分支(多个transitions),action/start/end 为单出口。
    • 示例:判断节点有两条转移(age>18 → 流程A,age<=18 → 流程B)。
  2. 条件表达式存储
    • 直接存储表达式字符串(如 "status == 'approved'"),业务层解析执行。
    • 复杂场景可扩展为存储JSON格式条件组(如 {"operator": "AND", "conditions": [...]})。
  3. 可视化布局
    • position_x/y 字段支持流程图绘制时的坐标还原。
  4. 默认分支处理
    • 当无明确条件匹配时,通过 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');

四、扩展性建议

  1. 动态属性
    若节点需存储额外参数(如超时时间),可通过 JSON 类型扩展:

    ALTER TABLE nodes ADD COLUMN attributes JSON;
    -- 示例:{"timeout": 72, "unit": "hours"}
    
  2. 版本控制
    如需保留历史版本,可新增 versions 表记录每次修改。

  3. 权限管理
    添加 acl 表关联角色与流程图访问权限。


此设计平衡了通用性与性能,可根据实际业务需求调整字段类型或增加约束。

上一篇 下一篇

猜你喜欢

热点阅读