16 KiB
16 KiB
数据库设计文档
本数据库采用 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):
{
"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 (中兴终端)
- DESKTOP (桌面端)
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- 获取最新版本客户端- 支持两种调用方式(兼容新旧版本,返回数据结构一致):
- 旧版:传
platform_type和platform_name参数 - 新版:传
platform_code参数(推荐)
- 旧版:传
- 支持两种调用方式(兼容新旧版本,返回数据结构一致):
POST /api/clients/upload- 上传客户端安装包(管理员)- 自动解析APK文件的版本信息
- 自动读取文件大小并生成下载URL
3. 关系图 (ERD)
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"