11 KiB
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
| 字段 | 类型 | 默认值 | 是否为空 | 说明 |
|---|---|---|---|---|
| (字段) | (类型) | (默认值) | (是否为空) | (说明) |