# 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
| 字段 | 类型 | 默认值 | 是否为空 | 说明 |
| --- | --- | --- | --- | --- |
| （字段） | （类型） | （默认值） | （是否为空） | （说明） |
