# 03-AI知识库系统数据库设计文档.docx 《03-AI知识库系统数据库设计文档》 版本:V1.0 数据库:MySQL 8.x 字符集:utf8mb4 存储引擎:InnoDB ## 第一章 数据库设计原则 ### 1.1 设计目标 数据库设计满足以下要求: • 支持高并发 AI 问答 • 满足权限控制 • 支持多知识库 • 支持后台管理 • 支持聊天历史永久保存 • 支持日志审计 • 支持后续功能扩展 ### 1.2 命名规范 #### 表名 全部采用: sys_xxx 例如: sys_user sys_chat sys_prompt #### 字段 统一采用: snake_case 例如: user_id created_at updated_at #### 主键 统一: BIGINT AUTO_INCREMENT #### 时间字段 统一: created_at updated_at DATETIME 类型。 #### 删除 采用: is_deleted 逻辑删除。 (聊天会话删除采用逻辑删除,知识库根据已确认需求允许物理删除。) ## 第二章 ER 模型 管理员 │ │ ├──────────────┐ │ │ ▼ ▼ 用户 ─────── 用户知识库权限 │ │ ▼ 聊天会话 │ ▼ 聊天消息 │ ▼ AI日志 ────────────────────────── 知识库 │ ▼ Prompt │ ▼ 模型配置 │ ▼ 系统配置 │ ▼ 操作日志 ## 第三章 数据表清单 一期预计数据库包含以下核心数据表: 后续可按需要增加统计汇总表、缓存表等。 ## 第四章 用户表(sys_user) ### 功能 保存系统普通用户信息。 ### 字段设计 ### 索引 ## 第五章 管理员表(sys_admin) ### 功能 保存后台管理员账号。 ### 字段 ## 第六章 角色表(sys_role) ### 字段 ### 角色示例 SUPER_ADMIN ADMIN OPERATOR CUSTOMER_SERVICE ## 第七章 知识库表(sys_knowledge) ### 功能 维护飞书知识库配置。 ### 字段 ### 删除规则 根据已确认需求: 支持物理删除 删除前需二次确认 自动解除用户权限关联 写入操作日志 以上完成了数据库设计文档的第一部分。 下一部分将继续设计以下核心数据表: sys_user_kb(用户知识库权限) sys_chat_session(聊天会话) sys_chat_message(聊天消息) sys_prompt sys_model sys_system_config sys_operation_log sys_ai_request_log 登录日志、短信日志 索引设计 外键关系 数据字典 建表 SQL 示例。 Grover Reaves 加入了群聊。 继续 @ChatGPT ChatGPT15:30 ## 第八章 用户知识库权限表(sys_user_kb) ### 8.1 功能说明 用于维护用户与知识库之间的授权关系。 支持: 一个用户拥有多个知识库 一个知识库授权给多个用户 永久授权 有效期授权 属于典型多对多关系表。 ### 8.2 字段设计 ### 索引 idx_user idx_knowledge idx_expired uk_user_kb (user_id,knowledge_id) 防止重复授权。 ## 第九章 聊天会话表(sys_chat_session) ### 功能 保存聊天会话。 每个聊天对应: 一个用户 ↓ 多个会话 ↓ 一个会话 ↓ 多条消息 ### 字段 ### 删除规则 用户删除: is_deleted=1 后台永久保存。 ## 第十章 聊天消息表(sys_chat_message) ### 功能 保存全部聊天内容。 ### 字段 ### 状态 WAITING GENERATING FINISHED STOPPED TIMEOUT FAILED ### 索引 idx_session idx_user idx_created ## 第十一章 AI 请求日志(sys_ai_request_log) ### 功能 记录 AI 每一次调用。 便于: 排查问题 Token 统计 耗时统计 飞书异常分析 ### 字段 ## 第十二章 Prompt 表(sys_prompt) 一期仅维护一条全局 Prompt。 ### 字段 ## 第十三章 AI 模型表(sys_model) ### 字段 ### 一期规则 始终: enabled=1 只能有一条 后台切换: 自动: 旧模型=0 新模型=1 ## 第十四章 系统配置表(sys_system_config) 采用: Key Value 方式。 ### 字段 ### 示例数据 ## 第十五章 操作日志表(sys_operation_log) ### 字段 ## 第十六章 登录日志(sys_login_log) ### 字段 ## 第十七章 短信日志(sys_sms_log) ### 字段 安全建议: 正式生产环境不要明文保存验证码,可仅保存哈希值或脱敏信息。 ## 第十八章 外键关系 sys_user │ ├──────────────┐ │ │ ▼ ▼ sys_chat_session sys_user_kb │ │ ▼ ▼ sys_chat_message sys_knowledge sys_admin │ ▼ sys_operation_log sys_model │ ▼ sys_ai_request_log 数据库层面建议尽量少使用物理外键约束,由应用层保证数据一致性,以降低高并发场景下的维护成本。 ## 第十九章 索引规范 所有业务表统一包含: PRIMARY KEY(id) created_at updated_at 常用查询字段建立普通索引: phone user_id session_id knowledge_id status last_login_at 唯一字段建立唯一索引: 手机号 管理员用户名 用户+知识库授权关系 ## 第二十章 数据库规范 ### 字符集 utf8mb4 ### 排序规则 utf8mb4_unicode_ci ### 引擎 InnoDB ### 主键 BIGINT AUTO_INCREMENT ### 时间字段 统一: DATETIME ### 事务 涉及以下操作必须使用事务: 用户创建 批量授权知识库 批量删除用户 删除知识库并解除权限关联 管理员批量操作 ## 第二十一章 数据字典规范 建议为每张表维护一份数据字典,包含: 该数据字典可同步导出为 数据库设计.xlsx,供开发、测试及运维共同使用。 ## 《数据库设计文档》第一版完成 目前数据库设计已覆盖: 用户体系 管理员体系 角色体系 知识库管理 用户知识库授权 聊天会话 聊天消息 AI 请求日志 Prompt 管理 模型管理 系统配置 登录日志 短信日志 操作日志 外键关系 索引规范 数据库设计规范 ## Table 1 | 序号 | 表名 | 用途 | | --- | --- | --- | | 1 | sys_user | 用户 | | 2 | sys_admin | 管理员 | | 3 | sys_role | 管理员角色 | | 4 | sys_user_kb | 用户知识库权限 | | 5 | sys_knowledge | 知识库 | | 6 | sys_chat_session | 聊天会话 | | 7 | sys_chat_message | 聊天消息 | | 8 | sys_prompt | Prompt 配置 | | 9 | sys_model | AI 模型 | | 10 | sys_system_config | 系统配置 | | 11 | sys_operation_log | 操作日志 | | 12 | sys_login_log | 登录日志 | | 13 | sys_ai_request_log | AI 请求日志 | | 14 | sys_sms_log | 短信发送日志 | ## Table 2 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BIGINT | 主键 | | phone | VARCHAR(20) | 手机号(唯一) | | name | VARCHAR(50) | 姓名 | | nickname | VARCHAR(50) | 昵称 | | status | TINYINT | 账号状态(0=禁用,1=启用) | | daily_chat_limit | INT | 每日聊天额度(可覆盖全局配置) | | daily_chat_used | INT | 当日已使用次数 | | effective_at | DATETIME | 生效时间 | | expired_at | DATETIME | 到期时间(可为空,表示永久) | | last_login_at | DATETIME | 最后登录时间 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | | is_deleted | TINYINT | 逻辑删除 | ## Table 3 | 名称 | 类型 | | --- | --- | | pk_id | 主键 | | uk_phone | 唯一索引 | | idx_status | 普通索引 | ## Table 4 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BIGINT | 主键 | | username | VARCHAR(50) | 登录账号(唯一) | | password | VARCHAR(255) | 密码(加密存储) | | name | VARCHAR(50) | 姓名 | | role_id | BIGINT | 角色ID | | status | TINYINT | 状态 | | last_login_at | DATETIME | 最后登录 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | ## Table 5 | 字段 | 类型 | | --- | --- | | id | BIGINT | | role_name | VARCHAR(50) | | role_code | VARCHAR(50) | | description | VARCHAR(255) | | created_at | DATETIME | ## Table 6 | 字段 | 类型 | | --- | --- | | id | BIGINT | | name | VARCHAR(100) | | feishu_space_id | VARCHAR(100) | | feishu_node_id | VARCHAR(100) | | status | TINYINT | | remark | VARCHAR(255) | | created_at | DATETIME | | updated_at | DATETIME | ## Table 7 | 字段 | 类型 | 说明 | | --- | --- | --- | | id | BIGINT | 主键 | | user_id | BIGINT | 用户ID | | knowledge_id | BIGINT | 知识库ID | | effective_at | DATETIME | 生效时间 | | expired_at | DATETIME | 到期时间(NULL=永久) | | created_by | BIGINT | 创建管理员 | | created_at | DATETIME | 创建时间 | | updated_at | DATETIME | 更新时间 | ## Table 8 | 字段 | 类型 | | --- | --- | | id | BIGINT | | user_id | BIGINT | | title | VARCHAR(100) | | message_count | INT | | last_message_at | DATETIME | | is_deleted | TINYINT | | created_at | DATETIME | | updated_at | DATETIME | ## Table 9 | 字段 | 类型 | | --- | --- | | id | BIGINT | | session_id | BIGINT | | user_id | BIGINT | | role | ENUM(user,assistant) | | content | LONGTEXT | | message_status | VARCHAR(20) | | token_input | INT | | token_output | INT | | response_time_ms | INT | | model_id | BIGINT | | created_at | DATETIME | ## Table 10 | 字段 | 类型 | | --- | --- | | id | BIGINT | | session_id | BIGINT | | message_id | BIGINT | | user_id | BIGINT | | model_name | VARCHAR(100) | | prompt | LONGTEXT | | knowledge_ids | VARCHAR(500) | | retrieve_count | INT | | input_token | INT | | output_token | INT | | total_token | INT | | cost_ms | INT | | status | VARCHAR(20) | | error_message | TEXT | | created_at | DATETIME | ## Table 11 | 字段 | 类型 | | --- | --- | | id | BIGINT | | prompt_content | LONGTEXT | | updated_by | BIGINT | | updated_at | DATETIME | ## Table 12 | 字段 | 类型 | | --- | --- | | id | BIGINT | | provider | VARCHAR(50) | | model_name | VARCHAR(100) | | api_url | VARCHAR(255) | | api_key | TEXT | | temperature | DECIMAL(3,2) | | max_token | INT | | timeout_second | INT | | enabled | TINYINT | | created_at | DATETIME | ## Table 13 | 字段 | 类型 | | --- | --- | | id | BIGINT | | config_key | VARCHAR(100) | | config_value | TEXT | | description | VARCHAR(255) | | updated_by | BIGINT | | updated_at | DATETIME | ## Table 14 | Key | Value | | --- | --- | | login_days | 30 | | daily_chat_limit | 100 | | ai_timeout | 30 | | feishu_retry | 2 | | show_reference | true | | allow_network | false | | context_mode | token | | context_value | 8192 | ## Table 15 | 字段 | 类型 | | --- | --- | | id | BIGINT | | admin_id | BIGINT | | module | VARCHAR(50) | | action | VARCHAR(50) | | target_id | BIGINT | | before_json | LONGTEXT | | after_json | LONGTEXT | | ip | VARCHAR(50) | | result | VARCHAR(20) | | created_at | DATETIME | ## Table 16 | 字段 | 类型 | | --- | --- | | id | BIGINT | | login_type | VARCHAR(20) | | user_id | BIGINT | | phone | VARCHAR(20) | | ip | VARCHAR(50) | | device | VARCHAR(255) | | result | VARCHAR(20) | | created_at | DATETIME | ## Table 17 | 字段 | 类型 | | --- | --- | | id | BIGINT | | phone | VARCHAR(20) | | sms_type | VARCHAR(50) | | verify_code | VARCHAR(10) | | status | VARCHAR(20) | | provider | VARCHAR(50) | | created_at | DATETIME | ## Table 18 | 字段 | 类型 | 默认值 | 是否为空 | 说明 | | --- | --- | --- | --- | --- | | (字段) | (类型) | (默认值) | (是否为空) | (说明) |