docs(database): 添加数据库设计文档

- 新建 design/database.md 文件,包含完整的数据库设计文档
- 定义用户、角色、会议、参会人、标签、音频文件等核心表结构
- 设计转录任务、转录内容分段、AI总结任务等功能相关表
- 包含知识库、提示词仓库、字典数据等扩展功能表设计
- 添加客户端
master
chenhao 2026-02-09 15:07:50 +08:00
commit a7a2bc87de
6 changed files with 436 additions and 0 deletions

436
design/database.md 100644
View File

@ -0,0 +1,436 @@
# 数据库设计文档
本数据库采用 `MySQL 5.7+`
## 1. 表结构概览
- **users**: 用户信息表
- **roles**: 角色信息表
- **meetings**: 会议主表
- **attendees**: 参会人员关联表
- **tags**: 标签表
- **audio_files**: 会议音频文件表
- **attachments**: 会议附件表 (未来扩展)
- **transcript_tasks**: 语音转录任务表
- **transcript_segments**: 语音转录内容分段表
- **meeting_summaries**: AI 生成的会议纪要表(由llm_tasks替代)
- **llm_tasks**: AI总结任务表
- **prompts**: 提示词仓库表
- **knowledge_bases**: 知识库主表
- **knowledge_bases_task**: 知识库生成任务表
- **dict_data**: 字典/码表数据表
- **client_downloads**: 客户端下载管理表
- **terminals**: 专用终端设备表
---
## 2. 表结构详情
### 2.1. `users` - 用户表
存储用户信息和登录凭证。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `user_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 用户唯一ID |
| `role_id` | INT | NOT NULL, FK | 角色ID (关联 `roles` 表) |
| `username` | VARCHAR(50) | UNIQUE, NOT NULL | 登录用户名 |
| `caption` | VARCHAR(50) | NOT NULL | 用户显示昵称 |
| `email` | VARCHAR(100) | UNIQUE, NOT NULL | 用户邮箱 |
| `password_hash` | VARCHAR(255) | NOT NULL | 哈希后的密码 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 账户创建时间 |
### 2.1.1 'user_voiceprint' - 用户声纹表
| 字段名 | 类型 | 说明 |
|--------|------|------|
| vp_id | INT | 主键自增ID |
| user_id | INT | 用户ID唯一索引 |
| file_path | VARCHAR(255) | 音频文件相对路径 |
| file_size | INT | 文件大小(字节) |
| duration_seconds | DECIMAL(5,2) | 音频时长(秒),如 10.25 |
| vector_data | TEXT | 声纹向量JSON数组如 [0.123, 0.456, ...] |
| collected_at | TIMESTAMP | 采集时间 |
| updated_at | TIMESTAMP | 更新时间 |
### 2.2. `roles` - 角色表
存储用户角色信息。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `role_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 角色唯一ID |
| `role_name` | VARCHAR(50) | UNIQUE, NOT NULL | 角色名称 (e.g., "admin", "user") |
### 2.3. `meetings` - 会议表
存储会议的核心元数据。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `meeting_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 会议唯一ID |
| `user_id` | INT | FK | 会议创建者ID (关联 `users` 表) |
| `title` | VARCHAR(255) | NOT NULL | 会议标题 |
| `meeting_time` | TIMESTAMP | NULL | 会议召开时间 |
| `user_prompt` | TEXT | NULL | 用户输入的提示词 (重复)|
| `summary` | TEXT | NULL | 会议摘要 (Markdown格式) |
| `tags` | VARCHAR(1024) | NULL | 以逗号分隔的标签字符串 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 记录创建时间 |
### 2.4. `attendees` - 参会人表
会议与用户的多对多关联表。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `attendee_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 唯一ID |
| `meeting_id` | INT | FK | 会议ID (关联 `meetings` 表) |
| `user_id` | INT | FK | 用户ID (关联 `users` 表) |
| | | UNIQUE (`meeting_id`, `user_id`) | |
### 2.5. `tags` - 标签表
存储所有唯一的标签及其颜色,用于快速检索和维护。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 标签唯一ID |
| `name` | VARCHAR(255) | UNIQUE, NOT NULL | 标签名称 |
| `color` | VARCHAR(7) | DEFAULT '#409EFF' | 标签颜色 (HEX) |
| `creator_id` INT NOT NULL, COMMENT '创建者用户ID (关联 `users` 表) ' |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
### 2.6. `audio_files` - 音频文件表
存储上传的会议音频文件信息。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `audio_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 音频文件唯一ID |
| `meeting_id` | INT | FK | 关联的会议ID |
| `file_name` | VARCHAR(255) | | 原始文件名 |
| `file_path` | VARCHAR(512) | NOT NULL | 文件存储相对路径 |
| `file_size` | BIGINT | NULL | 文件大小 (bytes) |
| `upload_time` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 上传时间 |
### 2.7. `attachments` - 会议附件表
存储会议相关的其他附件如PPT、PDF等。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `attachment_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 附件唯一ID |
| `meeting_id` | INT | FK | 关联的会议ID |
| `file_name` | VARCHAR(255) | NOT NULL | 原始文件名 |
| `file_path` | VARCHAR(512) | NOT NULL | 文件存储路径或URL |
| `file_type` | VARCHAR(100) | | 文件MIME类型 |
| `uploaded_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 上传时间 |
### 2.8. `transcript_tasks` - 转录任务表
记录语音转录任务的状态和元数据。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) |
| `paraformer_task_id`| VARCHAR(100) | NULL | 外部服务 (Dashscope) 的任务ID |
| `meeting_id` | INT | NOT NULL, FK | 关联的会议ID |
| `status` | ENUM(...) | DEFAULT 'pending' | 任务状态: 'pending', 'processing', 'completed', 'failed' |
| `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 |
| `completed_at` | TIMESTAMP | NULL | 任务完成时间 |
| `error_message` | TEXT | NULL | 错误信息记录 |
### 2.9. `transcript_segments` - 转录内容分段表
存储转录后的文字内容,按句子和发言人分段。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `segment_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 分段唯一ID |
| `meeting_id` | INT | FK | 关联的会议ID |
| `speaker_id` | INT | | AI识别的原始发言人ID (e.g., 0, 1, 2) |
| `speaker_tag` | VARCHAR(50) | NOT NULL | 用户可编辑的发言人标签 (e.g., "张三") |
| `start_time_ms` | INT | NOT NULL | 在音频中的开始时间 (毫秒) |
| `end_time_ms` | INT | NOT NULL | 在音频中的结束时间 (毫秒) |
| `text_content` | TEXT | NOT NULL | 转录的文本内容 |
### 2.10. `meeting_summaries` - 会议纪要表(作废)
存储由LLM生成的会议纪要。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 纪要唯一ID |
| `meeting_id` | INT | FK | 关联的会议ID |
| `summary_content` | TEXT | NULL | 生成的纪要内容 |
| `user_prompt` | TEXT | NULL | 用户输入的额外提示 |
| `prompt_id` | INT | FK | 关联的提示词模版ID |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 生成时间 |
### 2.11. `llm_tasks` - AI总结任务表
记录异步生成AI总结的任务状态。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) |
| `meeting_id` | INT | NOT NULL, FK | 关联的会议ID |
| `prompt_id` | INT | NOT NULL, FK | 关联的提示词模版ID |
| `user_prompt` | TEXT | NULL | 用户输入的额外提示 |
| `status` | ENUM(...) | DEFAULT 'pending' | 任务状态: 'pending', 'processing', 'completed', 'failed' |
| `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) |
| `result` | TEXT | NULL | 成功时存储生成的纪要内容 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 |
| `completed_at` | TIMESTAMP | NULL | 任务完成时间 |
| `error_message` | TEXT | NULL | 错误信息记录 |
### 2.13. `knowledge_bases` - 知识库表
存储用户生成和管理的知识库条目。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `kb_id` | INT | PRIMARY KEY, AUTO_INCREMENT | 知识库条目唯一ID |
| `title` | VARCHAR(255) | NOT NULL | 标题 |
| `user_prompt` | TEXT | NULL | 用户输入的提示词(重复) |
| `content` | TEXT | NULL | 生成的知识库内容 (Markdown格式) |
| `creator_id` | INT | NOT NULL, FK | 创建者用户ID (关联 `users` 表) |
| `is_shared` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为共享知识库 (TRUE: 共享, FALSE: 个人) |
| `source_meeting_ids` | TEXT | NULL | 内容来源的会议ID列表 (逗号分隔) |
| `tags` | VARCHAR(255) | NULL | 逗号分隔的标签 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 最后更新时间 |
### 2.14. `knowledge_base_tasks` - 知识库生成任务表
记录异步生成知识库内容的AI任务状态。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `task_id` | VARCHAR(100) | PRIMARY KEY | 业务任务唯一ID (UUID) |
| `user_id` | INT | NOT NULL, FK | 发起任务的用户ID (关联 `users` 表) |
| `kb_id` | INT | NOT NULL, FK | 关联的知识库条目ID (关联 `knowledge_bases` 表) |
| `prompt_id` | INT | NOT NULL, FK | 关联的提示词模版ID |
| `user_prompt` | TEXT | NULL | 用户输入的提示词 |
| `status` | ENUM('pending', 'processing', 'completed', 'failed') | NOT NULL, DEFAULT 'pending' | 任务状态 |
| `progress` | INT | DEFAULT 0 | 任务进度百分比 (0-100) |
| `error_message` | TEXT | NULL | 任务失败时的错误信息 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 任务创建时间 |
| `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 任务状态更新时间 |
| `completed_at` | TIMESTAMP | NULL | 任务完成时间 |
### 2.12. `prompts` - 提示词仓库表
存储系统中各种任务使用的大模型提示词模板。每个任务类型(会议任务、知识库任务)可以有多个提示词,但只能有一个默认且启用的提示词。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | INT | AUTO_INCREMENT, PRIMARY KEY | 提示词唯一ID |
| `name` | VARCHAR(255) | NOT NULL | 提示词名称 |
| `task_type` | ENUM('MEETING_TASK', 'KNOWLEDGE_TASK') | NOT NULL | 任务类型MEETING_TASK-会议任务, KNOWLEDGE_TASK-知识库任务 |
| `content` | TEXT | NOT NULL | 完整的提示词内容 |
| `is_default` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为该任务类型的默认模板 |
| `is_active` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用(只有启用的提示词才能被使用) |
| `creator_id` | INT | NOT NULL, FK | 创建者用户ID (关联 `users` 表) |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
**约束说明:**
- 每个 `task_type` 同一时间只能有一个 `is_default=TRUE` 的提示词
- 业务逻辑需确保:设置新默认提示词时,自动取消同类型其他提示词的默认状态
### 2.15. `prompt_config` - 提示词配置表(已废弃)
**该表已废弃,功能整合到 `prompts` 表的 `task_type``is_default` 字段。**
### 2.16. `dict_data` - 字典/码表数据表
存储系统中的码表数据,支持树形结构和扩展属性,用于管理客户端平台类型等配置数据。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 主键ID |
| `dict_type` | VARCHAR(64) | NOT NULL, DEFAULT 'client_platform' | 字典类型(如 client_platform |
| `dict_code` | VARCHAR(64) | NOT NULL | 业务编码唯一Key如 WIN、IOS、ANDROID |
| `parent_code` | VARCHAR(64) | NOT NULL, DEFAULT 'ROOT' | 父级编码ROOT为顶级支持树形结构 |
| `tree_path` | VARCHAR(255) | NULL | 层级路径(辅助字段,如 0,1,10 |
| `label_cn` | VARCHAR(128) | NOT NULL | 中文名称 |
| `label_en` | VARCHAR(128) | NULL | 英文名称 |
| `sort_order` | INT | DEFAULT 0 | 排序权重 |
| `extension_attr` | JSON | NULL | 扩展属性JSON格式存储平台特有属性 |
| `is_default` | TINYINT | DEFAULT 0 | 是否默认选中0: 否, 1: 是) |
| `status` | TINYINT | DEFAULT 1 | 状态1: 正常, 0: 停用) |
| `create_time` | DATETIME | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| | | UNIQUE KEY (`dict_type`, `dict_code`) | 确保编码在同类型下唯一 |
**扩展属性示例extension_attr**
```json
{
"suffix": ".exe",
"arch_support": ["x86", "x64"],
"icon": "monitor"
}
```
**树形结构示例:**
- ROOT
- DESKTOP (桌面端)
- WIN (Windows)
- MAC (macOS)
- LINUX (Linux)
- MOBILE (移动端)
- IOS (苹果iOS)
- ANDROID (安卓)
- TERMINAL (专用终端)
- TERM_STD (通用终端)
- TERM_S100 (中兴终端)
### 2.17. `client_downloads` - 客户端下载管理表
存储各平台客户端版本信息,用于管理客户端下载和版本更新。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 主键ID |
| `platform_code` | VARCHAR(64) | NOT NULL | 平台编码(关联 `dict_data.dict_code` |
| `version` | VARCHAR(50) | NOT NULL | 版本号(如 1.0.0 |
| `version_code` | INT | NOT NULL | 版本号数值(用于版本比较) |
| `download_url` | VARCHAR(512) | NOT NULL | 下载链接 |
| `file_size` | BIGINT | NULL | 文件大小bytes |
| `release_notes` | TEXT | NULL | 更新说明 |
| `is_active` | BOOLEAN | NOT NULL, DEFAULT TRUE | 是否启用 |
| `is_latest` | BOOLEAN | NOT NULL, DEFAULT FALSE | 是否为最新版本 |
| `min_system_version` | VARCHAR(50) | NULL | 最低系统版本要求 |
| `created_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP | 创建时间 |
| `updated_at` | TIMESTAMP | DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP | 更新时间 |
| `created_by` | INT | NULL, FK | 创建者用户ID关联 `users` 表) |
| | | INDEX (`platform_code`) | 平台编码索引 |
**约束说明:**
- 同一 `platform_code` 同一时间只应有一个 `is_latest=TRUE` 的版本
- `platform_code` 关联 `dict_data` 表的 `dict_code` 字段client_platform类型
- 业务逻辑需确保:设置新最新版本时,自动取消同平台其他版本的最新状态
### 2.18. `terminals` - 专用终端设备表
存储专用终端设备信息(如录音笔、会议平板等),用于设备激活管理和状态监控。
| 字段名 | 类型 | 约束 | 描述 |
| :--- | :--- | :--- | :--- |
| `id` | INT | PRIMARY KEY, AUTO_INCREMENT | 主键ID |
| `imei` | VARCHAR(64) | NOT NULL, UNIQUE | IMEI号(设备唯一标识) |
| `terminal_name` | VARCHAR(100) | NULL | 终端名称/设备别名 |
| `terminal_type` | VARCHAR(50) | NOT NULL | 终端类型(关联 `dict_data.dict_code`) |
| `description` | VARCHAR(500) | NULL | 终端说明/备注 |
| `status` | TINYINT(1) | NOT NULL, DEFAULT 1 | 启用状态: 1-启用, 0-停用 |
| `is_activated` | TINYINT(1) | NOT NULL, DEFAULT 0 | 激活状态: 1-已激活, 0-未激活 |
| `activated_at` | DATETIME | NULL | 激活时间 |
| `firmware_version` | VARCHAR(50) | NULL | 当前固件版本 |
| `last_online_at` | DATETIME | NULL | 最后在线/心跳时间 |
| `ip_address` | VARCHAR(50) | NULL | 最近一次连接IP |
| `mac_address` | VARCHAR(64) | NULL | MAC地址 |
| `created_at` | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP | 录入时间 |
| `updated_at` | DATETIME | NOT NULL, DEFAULT CURRENT_TIMESTAMP ON UPDATE | 更新时间 |
| `created_by` | INT | NULL, FK | 录入人ID关联 `users` 表) |
| | | KEY `idx_terminal_type` | 终端类型索引 |
| | | KEY `idx_status` | 状态索引 |
---
## 3. 关系图 (ERD)
```mermaid
erDiagram
users {
int user_id PK
varchar(50) username
varchar(50) caption
varchar(100) email
varchar(255) password_hash
int role_id FK
timestamp created_at
}
roles {
int role_id PK
varchar(50) role_name
}
meetings {
int meeting_id PK
int user_id FK
varchar(255) title
timestamp meeting_time
text summary
varchar(1024) tags
timestamp created_at
}
tags {
int id PK
varchar(255) name
varchar(7) color
}
attendees {
int attendee_id PK
int meeting_id FK
int user_id FK
}
audio_files {
int audio_id PK
int meeting_id FK
varchar(512) file_path
varchar(100) task_id
}
transcript_tasks {
varchar(100) task_id PK
int meeting_id FK
varchar(100) paraformer_task_id
enum status
int progress
}
transcript_segments {
int segment_id PK
int meeting_id FK
int speaker_id
varchar(50) speaker_tag
int start_time_ms
int end_time_ms
text text_content
}
meeting_summaries {
int id PK
int meeting_id FK
text summary_content
}
llm_tasks {
varchar(100) task_id PK
int meeting_id FK
enum status
int progress
}
dedicated_terminals {
int id PK
varchar(64) imei
varchar(50) terminal_type
tinyint status
tinyint is_activated
}
users ||--o{ meetings : "creates"
users ||--o{ attendees : "attends"
users }|..|| roles : "has role"
meetings ||--|{ attendees : "has"
meetings ||--|{ audio_files : "has"
meetings ||--|{ transcript_tasks : "has"
meetings ||--|{ transcript_segments : "has"
meetings ||--|{ meeting_summaries : "has"
meetings ||--|{ llm_tasks : "has"
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

BIN
design/首页.PNG 100644

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB