imetting/database.md

413 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 数据库设计文档
本数据库采用 `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**: 客户端下载管理表
---
## 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类型
- 业务逻辑需确保:设置新最新版本时,自动取消同平台其他版本的最新状态
**相关API接口**
- `GET /api/clients/latest/by-platform` - 获取最新版本客户端
- 支持两种调用方式(兼容新旧版本,返回数据结构一致):
1. 旧版:传 `platform_type``platform_name` 参数
2. 新版:传 `platform_code` 参数(推荐)
- `POST /api/clients/upload` - 上传客户端安装包(管理员)
- 自动解析APK文件的版本信息
- 自动读取文件大小并生成下载URL
---
## 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
}
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"
```