Files
QuestionProject/ai_knowledge_base_v2/extracted/03-AI知识库系统数据库设计文档.md

788 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
| 字段 | 类型 | 默认值 | 是否为空 | 说明 |
| --- | --- | --- | --- | --- |
| (字段) | (类型) | (默认值) | (是否为空) | (说明) |