工作流系统数据库设计文档
数据库选型
PostgreSQL - 支持JSONB、事务、外键约束,适合工作流系统的复杂数据结构和一致性要求。
核心表设计
1. Sessions 表
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE INDEX idx_sessions_user_id ON sessions(user_id);
2. Chats 表
CREATE TABLE chats (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
session_id UUID NOT NULL REFERENCES sessions(session_id) ON DELETE CASCADE,
user_id UUID NOT NULL,
message_type VARCHAR(20) NOT NULL, -- user, assistant, system
content TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
sequence_number INTEGER NOT NULL
);
CREATE INDEX idx_messages_session_id ON messages(session_id);
CREATE INDEX idx_messages_user_id ON messages(user_id);
CREATE INDEX idx_messages_session_sequence ON messages(session_id, sequence_number);
数据关系
Users (1) ────> (N) Sessions ────> (N) Messages
│ │
│ └──> (N) Workflows
│ │
│ └──> (N) Workflow_Templates
│
└────> (N) Workflow_Templates
常用查询
会话管理
-- 获取用户的活跃会话
SELECT * FROM sessions WHERE user_id = ? AND status = 'active';
-- 获取会话的所有消息
SELECT * FROM messages WHERE session_id = ? ORDER BY sequence_number;
工作流版本管理
-- 获取当前工作流
SELECT * FROM workflows WHERE session_id = ? AND is_current = true;
-- 获取上一个工作流
WITH current_workflow AS (
SELECT sequence_number FROM workflows
WHERE session_id = ? AND is_current = true
)
SELECT w.* FROM workflows w, current_workflow c
WHERE w.session_id = ? AND w.sequence_number = c.sequence_number - 1;
-- 获取工作流历史
SELECT workflow_id, sequence_number, status, created_at, is_current
FROM workflows WHERE session_id = ? ORDER BY sequence_number;
工作流创建
-- 创建新版本工作流
BEGIN;
UPDATE workflows SET is_current = false WHERE session_id = ? AND is_current = true;
INSERT INTO workflows (workflow_id, session_id, user_id, sequence_number, parent_workflow_id, is_current)
SELECT ?, ?, ?, COALESCE(MAX(sequence_number), 0) + 1, ?, true
FROM workflows WHERE session_id = ?;
COMMIT;
-- 从模板创建工作流
INSERT INTO workflows (workflow_id, session_id, user_id, sequence_number,
source_type, source_template_id, workflow_data, is_current)
SELECT ?, ?, ?, 1, 'template', wt.template_id, wt.template_data, true
FROM workflow_templates wt WHERE wt.template_id = ?;
模板系统
-- 获取可用模板
SELECT t.*,
CASE
WHEN t.created_by_user_id = ? THEN 'own'
WHEN t.is_official = true THEN 'official'
ELSE 'community'
END as template_source
FROM workflow_templates t
WHERE t.is_public = true OR t.created_by_user_id = ? OR t.is_official = true
ORDER BY t.is_official DESC, t.usage_count DESC;
-- 保存工作流为模板
INSERT INTO workflow_templates (template_id, template_name, description,
created_by_user_id, is_public, template_data)
SELECT ?, ?, ?, w.user_id, ?, w.workflow_data
FROM workflows w WHERE w.workflow_id = ?;
源追踪
-- 查询工作流来源
SELECT w.workflow_id, w.source_type,
CASE
WHEN w.source_type = 'template' THEN wt.template_name
WHEN w.source_type = 'user_workflow' THEN 'Copied from user workflow'
ELSE 'Created from scratch'
END as source_info
FROM workflows w
LEFT JOIN workflow_templates wt ON w.source_template_id = wt.template_id
WHERE w.workflow_id = ?;
缓存策略
Redis 缓存结构:
{
"session:{session_id}": {"status": "active", "user_id": "user_123"},
"workflow:{workflow_id}": {"status": "complete", "session_id": "session_123"},
"session_workflows:{session_id}": ["wf_001", "wf_002"],
"sse_connections": {"session_id": ["connection_1", "connection_2"]}
}
核心特性
- 多版本管理:支持工作流的修改历史和版本回退
- 模板系统:官方模板、社区模板、用户私有模板
- 源追踪:记录工作流的创建来源
- 实时推送:配合SSE实现工作流状态实时更新
- 用户隔离:所有数据都有user_id标识归属