imetting/backend/sql/database_setup.sql

269 lines
13 KiB
SQL
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.

-- iMeeting 数据库初始化脚本 (MySQL 5.7 兼容)
-- 基于 project.md v3
-- 设置数据库和字符集
-- 请在使用前手动创建数据库: CREATE DATABASE imeeting CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- USE imeeting;
-- 删除已存在的表 (用于重新执行脚本)
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `meeting_summaries`, `transcript_segments`, `audio_files`, `attachments`, `attendees`, `meetings`, `users`, `tags`;
SET FOREIGN_KEY_CHECKS = 1;
-- 1. 创建表结构
-- 用户表
CREATE TABLE `users` (
`user_id` INT AUTO_INCREMENT PRIMARY KEY,
`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
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 会议表
CREATE TABLE `meetings` (
`meeting_id` INT AUTO_INCREMENT PRIMARY KEY,
`user_id` INT, -- 会议创建者
`title` VARCHAR(255) NOT NULL,
`meeting_time` TIMESTAMP NULL,
`summary` TEXT, -- 以Markdown格式存储
`tags` VARCHAR(1024) DEFAULT NULL, -- 以逗号分隔的标签字符串
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 参会人表 (关联用户)
CREATE TABLE `attendees` (
`attendee_id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_id` INT,
`user_id` INT,
UNIQUE KEY `uk_meeting_user` (`meeting_id`, `user_id`) -- 确保同一用户在同一会议中只出现一次
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 会议材料附件表
CREATE TABLE `attachments` (
`attachment_id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_id` INT,
`file_name` VARCHAR(255) NOT NULL,
`file_path` VARCHAR(512) NOT NULL, -- 存储路径或URL
`file_type` VARCHAR(100),
`uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 音频文件与处理任务表
CREATE TABLE `audio_files` (
`audio_id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_id` INT,
`file_name` VARCHAR(255),
`file_path` VARCHAR(512) NOT NULL,
`file_size` BIGINT DEFAULT NULL,
`upload_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`processing_status` VARCHAR(20) DEFAULT 'uploaded', -- 'uploaded', 'processing', 'completed', 'failed'
`error_message` TEXT
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 转录任务表
CREATE TABLE `transcript_tasks` (
`task_id` VARCHAR(100) PRIMARY KEY,
`paraformer_task_id` VARCHAR(100) DEFAULT NULL,
`meeting_id` INT NOT NULL,
`status` ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
`progress` INT DEFAULT 0, -- 0-100 进度百分比
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`completed_at` TIMESTAMP NULL,
`error_message` TEXT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 转录内容表 (核心)
CREATE TABLE `transcript_segments` (
`segment_id` INT AUTO_INCREMENT PRIMARY KEY,
`meeting_id` INT,
`speaker_id` INT, -- 解析出来的人员ID
`speaker_tag` VARCHAR(50) NOT NULL, -- e.g., "Speaker A", "李雷"
`start_time_ms` INT NOT NULL, -- 音频开始时间(毫秒)
`end_time_ms` INT NOT NULL, -- 音频结束时间(毫秒)
`text_content` TEXT NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 标签表 (用于标签快速检索和颜色管理)
CREATE TABLE `tags` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`color` varchar(7) DEFAULT '#409EFF',
`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `tag_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 2. 插入测试数据
-- 插入用户 (4名)
INSERT INTO `users` (`username`, `caption`, `email`, `password_hash`) VALUES
('user1', 'alice', 'alice@example.com', 'hashed_password_1'),
('user2', 'bob', 'bob@example.com', 'hashed_password_2'),
('user3', 'charlie', 'charlie@example.com', 'hashed_password_3'),
('user4', 'david', 'david@example.com', 'hashed_password_4');
-- 插入会议 (6条)
INSERT INTO `meetings` (`user_id`, `title`, `meeting_time`, `summary`, `tags`) VALUES
(1, 'Q3产品战略规划会', '2025-07-28 10:00:00', '# Q3产品战略规划会
## 核心议题
- **目标**: 确定Q3主要产品迭代方向。
- **讨论**: AI功能集成方案。
## 结论
- 推进AI摘要功能开发。', '产品,重要'),
(2, '“智慧大脑”项目技术评审', '2025-07-29 14:30:00', '技术方案已通过,部分细节待优化。', '技术'),
(1, '营销团队周会', '2025-07-30 09:00:00', '回顾上周数据,制定本周计划。', '营销'),
(3, '关于新版UI的设计评审', '2025-07-30 11:00:00', '## UI评审
- **优点**: 简洁、现代。
- **待办**: 调整登录页按钮颜色。', '设计'),
(4, '年度财务报告初审', '2025-07-31 15:00:00', NULL, NULL),
(2, '服务器架构升级讨论', '2025-08-01 16:00:00', '初步同意采用微服务架构。', '技术,重要');
-- 插入参会人
-- 会议1: Alice, Bob, Charlie
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (1, 1), (1, 2), (1, 3);
-- 会议2: Bob, David
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (2, 2), (2, 4);
-- 会议3: Alice, Charlie
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (3, 1), (3, 3);
-- 会议4: Charlie, Alice, David
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (4, 3), (4, 1), (4, 4);
-- 会议5: David, Bob
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (5, 4), (5, 2);
-- 会议6: Bob, Charlie, David
INSERT INTO `attendees` (`meeting_id`, `user_id`) VALUES (6, 2), (6, 3), (6, 4);
-- 插入会议材料
INSERT INTO `attachments` (`meeting_id`, `file_name`, `file_path`, `file_type`) VALUES
(1, 'Q3产品规划.pptx', '/uploads/meeting_1/q3_plan.pptx', 'application/vnd.openxmlformats-officedocument.presentationml.presentation'),
(2, '技术方案V2.pdf', '/uploads/meeting_2/tech_spec_v2.pdf', 'application/pdf');
-- 插入音频文件记录
INSERT INTO `audio_files` (`meeting_id`, `file_name`, `file_path`, `file_size`, `processing_status`) VALUES
(1, 'meeting_1_audio.mp3', '/uploads/audio/1/meeting_1_audio.mp3', 15728640, 'completed'),
(2, 'meeting_2_audio.wav', '/uploads/audio/2/meeting_2_audio.wav', 23456780, 'processing'),
(3, 'meeting_3_audio.m4a', '/uploads/audio/3/meeting_3_audio.m4a', 18923456, 'uploaded'),
(4, 'meeting_4_audio.mp3', '/uploads/audio/4/meeting_4_audio.mp3', 12345678, 'failed');
-- 插入转录任务记录
INSERT INTO `transcript_tasks` (`task_id`, `meeting_id`, `status`, `progress`, `created_at`) VALUES
('task-uuid-1', 1, 'completed', 100, '2025-07-28 10:05:00'),
('task-uuid-2', 2, 'processing', 45, '2025-07-29 14:35:00'),
('task-uuid-4', 4, 'failed', 0, '2025-07-30 11:05:00');
-- 插入转录内容 (为会议1)
INSERT INTO `transcript_segments` (`meeting_id`, `speaker_id`, `speaker_tag`, `start_time_ms`, `end_time_ms`, `text_content`) VALUES
(1, 0, '发言人 0', 5200, 9800, '好的我们开始今天Q3的战略规划会。'),
(1, 1, '发言人 1', 10100, 15500, '我先同步一下上个季度的数据我们的用户增长了20%,主要来自于新推出的移动端。'),
(1, 0, '发言人 0', 16000, 21300, '非常好。这个季度我希望我们能重点讨论一下AI功能的集成特别是会议摘要这部分。'),
(1, 2, '发言人 2', 21800, 28000, '我同意,自动摘要可以极大地提升用户体验,我这边已经做了一些初步的技术调研。');
-- 插入标签
INSERT INTO `tags` (`name`, `color`) VALUES
('产品', '#409EFF'),
('技术', '#67C23A'),
('营销', '#E6A23C'),
('设计', '#F56C6C'),
('重要', '#909399');
-- 3. 添加外键约束
ALTER TABLE `meetings` ADD CONSTRAINT `fk_meetings_user` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE;
ALTER TABLE `attendees` ADD CONSTRAINT `fk_attendees_meeting` FOREIGN KEY (`meeting_id`) REFERENCES `meetings`(`meeting_id`) ON DELETE CASCADE;
ALTER TABLE `attendees` ADD CONSTRAINT `fk_attendees_user` FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE;
ALTER TABLE `attachments` ADD CONSTRAINT `fk_attachments_meeting` FOREIGN KEY (`meeting_id`) REFERENCES `meetings`(`meeting_id`) ON DELETE CASCADE;
ALTER TABLE `audio_files` ADD CONSTRAINT `fk_audio_files_meeting` FOREIGN KEY (`meeting_id`) REFERENCES `meetings`(`meeting_id`) ON DELETE CASCADE;
ALTER TABLE `transcript_tasks` ADD CONSTRAINT `fk_transcript_tasks_meeting` FOREIGN KEY (`meeting_id`) REFERENCES `meetings`(`meeting_id`) ON DELETE CASCADE;
ALTER TABLE `transcript_segments` ADD CONSTRAINT `fk_transcript_segments_meeting` FOREIGN KEY (`meeting_id`) REFERENCES `meetings`(`meeting_id`) ON DELETE CASCADE;
-- 4. 添加索引优化查询性能
-- audio_files 表索引
ALTER TABLE `audio_files` ADD INDEX `idx_meeting_id` (`meeting_id`);
ALTER TABLE `audio_files` ADD INDEX `idx_task_id` (`task_id`);
ALTER TABLE `audio_files` ADD INDEX `idx_processing_status` (`processing_status`);
-- transcript_tasks 表索引
ALTER TABLE `transcript_tasks` ADD INDEX `idx_meeting_id` (`meeting_id`);
ALTER TABLE `transcript_tasks` ADD INDEX `idx_status` (`status`);
ALTER TABLE `transcript_tasks` ADD INDEX `idx_created_at` (`created_at`);
-- transcript_segments 表索引
ALTER TABLE `transcript_segments` ADD INDEX `idx_meeting_id` (`meeting_id`);
ALTER TABLE `transcript_segments` ADD INDEX `idx_speaker_id` (`speaker_id`);
ALTER TABLE `transcript_segments` ADD INDEX `idx_start_time` (`start_time_ms`);
-- meetings 表索引
ALTER TABLE `meetings` ADD INDEX `idx_user_id` (`user_id`);
ALTER TABLE `meetings` ADD INDEX `idx_meeting_time` (`meeting_time`);
ALTER TABLE `meetings` ADD INDEX `idx_created_at` (`created_at`);
ALTER TABLE `meetings` ADD INDEX `idx_tags` (`tags`(255));
-- attendees 表索引
ALTER TABLE `attendees` ADD INDEX `idx_meeting_id` (`meeting_id`);
ALTER TABLE `attendees` ADD INDEX `idx_user_id` (`user_id`);
-- attachments 表索引
ALTER TABLE `attachments` ADD INDEX `idx_meeting_id` (`meeting_id`);
-- tags 表索引
ALTER TABLE `tags` ADD INDEX `idx_name` (`name`);
-- 脚本结束
SELECT '数据库初始化脚本 (MySQL) 执行完毕。';
-- Knowledge Base Tables
CREATE TABLE IF NOT EXISTS `prompts` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(255) NOT NULL UNIQUE COMMENT '提示词名称,保持唯一以方便管理',
`tags` VARCHAR(255) COMMENT '标签,用于分类和搜索,多个标签用逗号分隔',
`content` TEXT NOT NULL COMMENT '完整的提示词内容',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'
) COMMENT='用于存储AI总结的提示词模板';
CREATE TABLE IF NOT EXISTS `knowledge_bases` (
`kb_id` INT AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR(255) NOT NULL COMMENT '标题',
`content` TEXT NULL COMMENT '生成的知识库内容 (Markdown格式)',
`creator_id` INT NOT NULL COMMENT '创建者用户ID',
`is_shared` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为共享知识库',
`source_meeting_ids` VARCHAR(255) NULL COMMENT '内容来源的会议ID列表 (逗号分隔)',
`tags` VARCHAR(255) NULL COMMENT '逗号分隔的标签',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (`creator_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE
) COMMENT='知识库条目表';
CREATE TABLE IF NOT EXISTS `knowledge_base_tasks` (
`task_id` VARCHAR(100) PRIMARY KEY COMMENT '业务任务唯一ID (UUID)',
`user_id` INT NOT NULL COMMENT '发起任务的用户ID',
`kb_id` INT NOT NULL COMMENT '关联的知识库条目ID',
`user_prompt` TEXT NULL COMMENT '用户输入的提示词',
`status` ENUM('pending', 'processing', 'completed', 'failed') NOT NULL DEFAULT 'pending' COMMENT '任务状态',
`progress` INT DEFAULT 0 COMMENT '任务进度百分比 (0-100)',
`error_message` TEXT NULL COMMENT '任务失败时的错误信息',
`created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`completed_at` TIMESTAMP NULL,
FOREIGN KEY (`user_id`) REFERENCES `users`(`user_id`) ON DELETE CASCADE,
FOREIGN KEY (`kb_id`) REFERENCES `knowledge_bases`(`kb_id`) ON DELETE CASCADE
) COMMENT='知识库生成任务表';
CREATE TABLE IF NOT EXISTS `prompt_config` (
`config_id` INT AUTO_INCREMENT PRIMARY KEY,
`task_name` VARCHAR(100) UNIQUE NOT NULL COMMENT '任务名称',
`prompt_id` INT NOT NULL COMMENT '关联的提示词模版ID',
FOREIGN KEY (`prompt_id`) REFERENCES `prompts`(`id`)
) COMMENT='提示词配置表';
-- Initial data for prompt_config
INSERT INTO `prompt_config` (`task_name`, `prompt_id`) VALUES ('LLM_TASK', 1);
INSERT INTO `prompt_config` (`task_name`, `prompt_id`) VALUES ('KNOWLEDGE_TASK', 2);
-- You might need to insert prompts with id=1 and id=2 into the `prompts` table for this to work.
-- Example:
-- INSERT INTO `prompts` (`id`, `name`, `content`) VALUES (1, 'Default Meeting Summary', 'Please summarize the following meeting transcript...');
-- INSERT INTO `prompts` (`id`, `name`, `content`) VALUES (2, 'Default Knowledge Base Generation', 'Please generate a knowledge base article from the following text...');