mysql_schema.sql 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. -- ============================================================
  2. -- deep_agent 2.0 — MySQL 8.0 建表脚本
  3. -- ============================================================
  4. -- 设计约定(为了让存储层同时可跑 sqlite 开发档,见 schema_sqlite.sql):
  5. -- 1. 主键用 VARCHAR(64) 的 UUID,不用 AUTO_INCREMENT
  6. -- 2. 结构化数据(tool_calls / citations / snapshot)以 TEXT 存 JSON 字符串,
  7. -- 不用 MySQL 的 JSON 类型,避免方言函数
  8. -- 3. 不用 ON DUPLICATE KEY UPDATE,upsert 在 Python 侧「先查后写」
  9. -- 4. 时间列一律 DATETIME(6)(本地时间),不用 TIMESTAMP 的时区语义
  10. --
  11. -- 执行:mysql -u <user> -p <db_name> < db/mysql_schema.sql
  12. -- 或由应用启动时的 init_schema() 自动执行(幂等,全部 IF NOT EXISTS)
  13. -- ============================================================
  14. -- ---------- 会话 ----------
  15. CREATE TABLE IF NOT EXISTS sessions (
  16. id VARCHAR(64) NOT NULL COMMENT '会话 ID(同时是 LangGraph thread_id)',
  17. title VARCHAR(255) NOT NULL DEFAULT '' COMMENT '会话标题,首轮自动生成',
  18. user_name VARCHAR(128) NOT NULL DEFAULT 'default' COMMENT '归属用户(2.0 无鉴权,由客户端自报)',
  19. mode VARCHAR(16) NOT NULL DEFAULT 'full' COMMENT '权限模式:plan | full',
  20. pinned TINYINT NOT NULL DEFAULT 0 COMMENT '是否置顶',
  21. created_at DATETIME(6) NOT NULL,
  22. updated_at DATETIME(6) NOT NULL,
  23. PRIMARY KEY (id),
  24. KEY idx_sessions_user_updated (user_name, updated_at),
  25. KEY idx_sessions_title (title)
  26. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话';
  27. -- ---------- 消息 ----------
  28. CREATE TABLE IF NOT EXISTS messages (
  29. id VARCHAR(64) NOT NULL,
  30. session_id VARCHAR(64) NOT NULL,
  31. msg_role VARCHAR(16) NOT NULL COMMENT 'user | assistant',
  32. content MEDIUMTEXT NULL,
  33. tool_calls MEDIUMTEXT NULL COMMENT 'JSON 数组:本轮工具调用摘要',
  34. citations MEDIUMTEXT NULL COMMENT 'JSON 数组:本轮来源标注',
  35. created_at DATETIME(6) NOT NULL,
  36. PRIMARY KEY (id),
  37. KEY idx_messages_session_created (session_id, created_at)
  38. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会话消息(事实源,冷启动据此补种图状态)';
  39. -- ---------- 上下文用量 ----------
  40. CREATE TABLE IF NOT EXISTS session_context_usage (
  41. id VARCHAR(64) NOT NULL,
  42. session_id VARCHAR(64) NOT NULL,
  43. turn INT NOT NULL DEFAULT 0 COMMENT '第几轮(从 1 起)',
  44. input_tokens INT NOT NULL DEFAULT 0,
  45. output_tokens INT NOT NULL DEFAULT 0,
  46. cache_read_tokens INT NOT NULL DEFAULT 0,
  47. total_tokens INT NOT NULL DEFAULT 0,
  48. usage_source VARCHAR(16) NOT NULL DEFAULT 'provider' COMMENT 'provider=模型真实返回 | estimate=本地估算',
  49. compacted TINYINT NOT NULL DEFAULT 0 COMMENT '本轮是否触发了上下文压缩',
  50. compact_count INT NOT NULL DEFAULT 0 COMMENT '会话累计压缩次数',
  51. snapshot MEDIUMTEXT NULL COMMENT 'JSON:压缩前原文落盘路径、上下文窗口、阈值等',
  52. created_at DATETIME(6) NOT NULL,
  53. PRIMARY KEY (id),
  54. KEY idx_ctx_session_created (session_id, created_at)
  55. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='上下文用量明细(口径以模型真实 usage 为准)';
  56. -- ---------- 历史消息压缩存档 ----------
  57. CREATE TABLE IF NOT EXISTS context_archives (
  58. id VARCHAR(64) NOT NULL,
  59. session_id VARCHAR(64) NOT NULL,
  60. turn INT NOT NULL DEFAULT 0,
  61. file_path VARCHAR(512) NOT NULL DEFAULT '' COMMENT '压缩前原文落盘的绝对路径',
  62. tokens INT NOT NULL DEFAULT 0 COMMENT '压缩前占用 token 估算',
  63. created_at DATETIME(6) NOT NULL,
  64. PRIMARY KEY (id),
  65. KEY idx_archive_session_created (session_id, created_at)
  66. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='压缩前原文存档索引,便于事后追溯';
  67. -- ---------- 定时任务 ----------
  68. CREATE TABLE IF NOT EXISTS schedules (
  69. id VARCHAR(64) NOT NULL,
  70. user_name VARCHAR(128) NOT NULL DEFAULT 'default',
  71. title VARCHAR(255) NOT NULL DEFAULT '',
  72. cron VARCHAR(64) NOT NULL COMMENT '5 段 cron 表达式',
  73. prompt TEXT NOT NULL COMMENT '触发时喂给 agent 的指令',
  74. mode VARCHAR(16) NOT NULL DEFAULT 'full',
  75. enabled TINYINT NOT NULL DEFAULT 1,
  76. created_at DATETIME(6) NOT NULL,
  77. updated_at DATETIME(6) NOT NULL,
  78. PRIMARY KEY (id),
  79. KEY idx_schedules_enabled (enabled)
  80. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务定义';
  81. CREATE TABLE IF NOT EXISTS schedule_runs (
  82. id VARCHAR(64) NOT NULL,
  83. schedule_id VARCHAR(64) NOT NULL,
  84. thread_id VARCHAR(160) NOT NULL COMMENT '独立 thread:scheduled-task-{id}-{run_id}',
  85. status VARCHAR(24) NOT NULL COMMENT 'running | success | failed',
  86. started_at DATETIME(6) NOT NULL,
  87. finished_at DATETIME(6) NULL,
  88. error TEXT NULL,
  89. output MEDIUMTEXT NULL,
  90. PRIMARY KEY (id),
  91. KEY idx_runs_schedule_started (schedule_id, started_at)
  92. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='定时任务执行记录';
  93. -- ---------- 计费 ----------
  94. CREATE TABLE IF NOT EXISTS billing_usage (
  95. id VARCHAR(64) NOT NULL,
  96. user_name VARCHAR(128) NOT NULL DEFAULT 'default',
  97. session_id VARCHAR(64) NOT NULL DEFAULT '',
  98. kind VARCHAR(24) NOT NULL DEFAULT 'chat' COMMENT 'chat | chat_only | resume | scheduled',
  99. model VARCHAR(128) NOT NULL DEFAULT '',
  100. input_tokens INT NOT NULL DEFAULT 0,
  101. output_tokens INT NOT NULL DEFAULT 0,
  102. total_tokens INT NOT NULL DEFAULT 0,
  103. cost DECIMAL(18,8) NOT NULL DEFAULT 0 COMMENT '按 billing_pricing 计价',
  104. usage_day CHAR(8) NOT NULL COMMENT 'YYYYMMDD,按请求开始时刻归属',
  105. trace_id VARCHAR(64) NOT NULL DEFAULT '',
  106. created_at DATETIME(6) NOT NULL,
  107. PRIMARY KEY (id),
  108. KEY idx_billing_user_day (user_name, usage_day),
  109. KEY idx_billing_session (session_id)
  110. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用量流水(每次请求一条)';
  111. CREATE TABLE IF NOT EXISTS billing_pricing (
  112. model VARCHAR(128) NOT NULL,
  113. input_price DECIMAL(18,8) NOT NULL DEFAULT 0 COMMENT '每 1K input token 单价',
  114. output_price DECIMAL(18,8) NOT NULL DEFAULT 0 COMMENT '每 1K output token 单价',
  115. currency VARCHAR(8) NOT NULL DEFAULT 'CNY',
  116. updated_at DATETIME(6) NOT NULL,
  117. PRIMARY KEY (model)
  118. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='模型单价表';
  119. CREATE TABLE IF NOT EXISTS daily_quota (
  120. user_name VARCHAR(128) NOT NULL,
  121. usage_day CHAR(8) NOT NULL,
  122. limit_tokens BIGINT NOT NULL DEFAULT 0 COMMENT '0 = 不限',
  123. used_tokens BIGINT NOT NULL DEFAULT 0,
  124. updated_at DATETIME(6) NOT NULL,
  125. PRIMARY KEY (user_name, usage_day)
  126. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='每用户每日额度与累计用量';
  127. -- ---------- 用户偏好 ----------
  128. CREATE TABLE IF NOT EXISTS user_preferences (
  129. id VARCHAR(64) NOT NULL,
  130. user_name VARCHAR(128) NOT NULL,
  131. pref_key VARCHAR(128) NOT NULL,
  132. pref_value TEXT NOT NULL,
  133. updated_at DATETIME(6) NOT NULL,
  134. PRIMARY KEY (id),
  135. UNIQUE KEY uk_pref_user_key (user_name, pref_key)
  136. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户偏好,新会话自动注入';