跳转到主要内容

概览

Shannon 使用 PostgreSQL 进行持久化存储。数据库组织为两个模式:
  • auth: 认证、多租户、API 密钥和安全审计日志。
  • public: 核心应用数据,包括任务、会话和使用指标。
总表数: 25 张表 扩展: uuid-ossp, pg_trgm, btree_gin, pgcrypto

实体关系图

模式: auth (认证与多租户)

auth.tenants

用途: 多租户组织管理 索引:
  • idx_tenants_slug ON (slug)
示例:

auth.users

用途: 用户认证和个人资料管理 索引:
  • idx_users_email ON (email)
  • idx_users_tenant_id ON (tenant_id)
示例:

auth.api_keys

用途: 编程访问的 API 密钥管理 索引:
  • idx_api_keys_key_hash ON (key_hash)
  • idx_api_keys_user_id ON (user_id)
默认作用域:
  • workflows:read: 允许读取工作流/任务状态和结果
  • workflows:write: 允许提交和管理工作流/任务
  • agents:execute: 允许执行代理
示例:

auth.refresh_tokens

用途: JWT 刷新令牌存储和撤销 索引:
  • idx_refresh_tokens_token_hash ON (token_hash)
  • idx_refresh_tokens_user_id ON (user_id)
  • idx_refresh_tokens_expires_at ON (expires_at)
示例:

auth.audit_logs

用途: 安全事件审计跟踪 索引:
  • idx_audit_logs_event_type ON (event_type)
  • idx_audit_logs_user_id ON (user_id)
  • idx_audit_logs_tenant_id ON (tenant_id)
  • idx_audit_logs_created_at ON (created_at)
事件类型:
  • login_success: 用户成功登录
  • login_failed: 用户登录失败
  • password_change: 密码已更改
  • api_key_created: API 密钥已创建
示例:

模式: public (核心应用)

users

用途: 应用用户配置文件(旧版,关联到 auth.users) 索引:
  • idx_users_tenant_id ON (tenant_id)
  • idx_users_external_id ON (external_id)
注意: 此表用于向后兼容。新代码应使用 auth.users

sessions

用途: 用户会话管理和上下文 索引:
  • idx_sessions_user_id ON (user_id)
  • idx_sessions_tenant_id ON (tenant_id)
  • idx_sessions_expires_at ON (expires_at)
  • idx_sessions_external_id ON ((context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL
  • idx_sessions_user_external_id UNIQUE ON (user_id, (context->>‘external_id’)) WHERE context->>‘external_id’ IS NOT NULL AND deleted_at IS NULL
  • idx_sessions_not_deleted ON (id) WHERE deleted_at IS NULL
外部会话 ID(非 UUID)存储在 context->>'external_id',用于双 ID 查询。 示例:

task_executions

用途: 任务/工作流执行历史和指标 索引:
  • idx_task_executions_workflow_id ON (workflow_id)
  • idx_task_executions_user_id ON (user_id)
  • idx_task_executions_session_id ON (session_id)
  • idx_task_executions_status ON (status)
  • idx_task_executions_started_at ON (started_at)
  • idx_task_executions_tenant_id_started_at ON (tenant_id, started_at)
状态值:
  • PENDING: 任务已创建但尚未开始
  • RUNNING: 任务正在进行中
  • COMPLETED: 任务成功完成
  • FAILED: 任务失败
示例:

agent_executions

用途: 任务中的单个代理执行详情 索引:
  • idx_agent_executions_workflow_id ON (workflow_id)
  • idx_agent_executions_created_at ON (created_at DESC)
  • idx_agent_executions_state ON (state)
状态值:
  • IDLE - 代理空闲
  • ANALYZING - 分析输入
  • PLANNING - 规划执行
  • RETRIEVING - 检索信息
  • EXECUTING - 执行任务
  • VALIDATING - 验证结果
  • SYNTHESIZING - 合成响应
  • COMPLETED - 执行完成
  • FAILED - 执行失败
示例:

tool_executions

用途: 工具调用历史和性能 索引:
  • idx_tool_executions_workflow_id ON (workflow_id)
  • idx_tool_executions_tool_name ON (tool_name)
  • idx_tool_executions_created_at ON (created_at DESC)
  • idx_tool_executions_success ON (success)
示例:

event_logs

用途: 流式事件存储,用于审计和重放 索引:
  • idx_event_logs_workflow_id ON (workflow_id)
  • idx_event_logs_task_id ON (task_id)
  • idx_event_logs_type ON (type)
  • idx_event_logs_agent_id ON (agent_id)
  • idx_event_logs_timestamp ON (timestamp)
  • idx_event_logs_stream_id ON (stream_id)
  • idx_event_logs_payload_gin USING GIN (payload)
事件类型:
  • task_started
  • agent_started
  • tool_invoked
  • task_completed
示例:

token_usage

用途: 每个任务的详细 token 使用跟踪 索引:
  • idx_token_usage_user_id ON (user_id)
  • idx_token_usage_task_id ON (task_id)
  • idx_token_usage_provider_model ON (provider, model)
  • idx_token_usage_created_at ON (created_at)
示例:

usage_daily_aggregates

用途: 预计算的每日使用统计 索引:
  • idx_usage_daily_aggregates_user_date UNIQUE ON (user_id, date)
  • idx_usage_daily_aggregates_date ON (date)
唯一约束: (user_id, date) 示例:

其他表

tool_calls

用途: 旧版工具调用跟踪(请改用 tool_executions)

prompts

用途: 提示词版本控制和 A/B 测试

learning_cases

用途: 强化学习案例存储

session_archives

用途: 来自 Redis 的长期会话快照

audit_logs (public)

用途: 应用审计跟踪(与 auth.audit_logs 分开)

数据库函数

update_updated_at_column()

用途: 行更改时自动更新 updated_at 使用: 作为触发器附加到 userssessions

update_daily_aggregate(user_id, date)

用途: 更新或创建用户的每日使用聚合 使用: 任务完成时通过触发器自动调用

trigger_update_daily_aggregate()

用途: 在任务状态更改时更新聚合的触发器函数 使用: 在 task_executions INSERT/UPDATE 时自动触发

示例查询

任务分析

成本分析

性能监控

最佳实践

1. 索引

始终为以下内容使用索引:
  • 外键 (user_id, tenant_id 等)
  • WHERE 子句中使用的高基数列 (status, mode)。
  • 时间序列数据 (created_at, started_at)。
  • 使用 GIN 索引的 JSONB 列。
当前索引覆盖率: 优秀(所有外键和常见查询都已建立索引)

2. 分区

对于高容量表,考虑分区:

3. 数据保留

推荐策略:
  • event_logs: 保留 90 天。
  • task_executions: 保留 1 年,归档旧记录。
  • audit_logs: 保留 2 年。
  • refresh_tokens: 每周清除过期/已撤销的令牌。
清理脚本:

4. 查询优化

使用 EXPLAIN ANALYZE:
使用覆盖索引优化:

5. 连接池

配置(Shannon 中已配置):

维护

Vacuum 和 Analyze

统计信息

相关文档

环境变量

数据库配置

性能调优

查询优化

监控

数据库监控