# 数据库设计文档 ## 1. 部门表 (departments) 用于存储组织的部门信息。 ```sql CREATE TABLE departments ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL COMMENT '部门名称', description TEXT DEFAULT NULL COMMENT '部门描述', created_at BIGINT NOT NULL COMMENT '创建时间(时间戳)', updated_at BIGINT NOT NULL COMMENT '更新时间(时间戳)' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='部门表'; ``` ### 字段说明 - `id`: 部门 ID,自增主键 - `name`: 部门名称,不可为空 - `description`: 部门描述,可为空 - `created_at`: 创建时间,毫秒级时间戳 - `updated_at`: 更新时间,毫秒级时间戳 ## 2. 用户表 (users) 存储系统用户信息,包括教师、管理员等角色。 ```sql CREATE TABLE users ( id BIGINT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL COMMENT '用户名', email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱', password VARCHAR(100) NOT NULL COMMENT '密码', department_id BIGINT NOT NULL COMMENT '所属部门', roles INT NOT NULL COMMENT '角色: 1-校方教师, 2-公司课程顾问, 3-校方项目负责人, 4-公司系统管理员', jobs INT NOT NULL COMMENT '岗位: 1-课程制作教师, 2-课程审核人员, 3-校方项目负责人, 4-公司系统管理员', avatar VARCHAR(255) DEFAULT NULL COMMENT '头像', creator_id BIGINT NOT NULL DEFAULT 1 COMMENT '创建用户的管理员ID', status INT NOT NULL DEFAULT 1 COMMENT '用户状态: 1-正常, 0-禁用', created_at BIGINT NOT NULL COMMENT '创建时间(时间戳)', updated_at BIGINT NOT NULL COMMENT '更新时间(时间戳)', FOREIGN KEY (department_id) REFERENCES departments (id) ON DELETE RESTRICT, INDEX idx_users_department_id (department_id) ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT ='用户表'; ``` ### 字段说明 - `id`: 用户 ID,自增主键 - `username`: 用户名,不可为空 - `email`: 邮箱地址,不可为空,唯一索引 - `password`: 密码(加密存储),不可为空 - `department_id`: 所属部门 ID,外键关联 departments 表 - `roles`: 用户角色,整数枚举: - 1: 教师 - 2: 普通管理员 - 3: 沟通联络人 - 4: 系统管理员 - `jobs`: 用户岗位,整数枚举: - 1: 课程制作教师 - 2: 课程购买方项目负责人 - 3: 课程制作方沟通联络人 - 4: 系统制作方项目负责人 - `avatar`: 用户头像 URL,可为空 - `creator_id`: 创建该用户的管理员 ID - `status`: 用户状态: - 1: 正常 - 0: 禁用 - `created_at`: 创建时间,毫秒级时间戳 - `updated_at`: 更新时间,毫秒级时间戳 ### 索引 - 主键索引:`id` - 外键索引:`idx_users_department_id (department_id)` - 唯一索引:`email` ## 3. 课程任务表 (lesson_tasks) 存储课程制作任务的信息和进度。 ```sql CREATE TABLE lesson_tasks ( id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键ID,系统自动生成的唯一标识', course_name VARCHAR(100) NOT NULL COMMENT '所属课程名称,标识任务所属的主课程', micro_lesson_name VARCHAR(100) NOT NULL COMMENT '具体微课名称,标识任务所属的具体微课单元', user_id BIGINT NOT NULL COMMENT '任务负责人ID,关联users表的主键id', progress_status INT NOT NULL DEFAULT 0 COMMENT '任务进度状态: 0-未开始:任务创建后的初始状态 1-脚本制作:正在编写课程脚本 2-脚本审核:脚本提交审核阶段 3-脚本确认:脚本审核通过确认 4-视频拍摄与制作:进行视频录制和后期制作 5-视频确认:最终视频审核确认', script_create_time BIGINT DEFAULT NULL COMMENT '脚本开始制作的时间戳,状态1时记录', script_review_time BIGINT DEFAULT NULL COMMENT '脚本提交审核的时间戳,状态2时记录', script_confirm_time BIGINT DEFAULT NULL COMMENT '脚本审核通过的时间戳,状态3时记录', video_create_time BIGINT DEFAULT NULL COMMENT '开始视频制作的时间戳,状态4时记录', video_confirm_time BIGINT DEFAULT NULL COMMENT '视频审核通过的时间戳,状态5时记录', finish_time BIGINT DEFAULT NULL COMMENT '整个任务完成的时间戳,最终确认后记录', advise TEXT DEFAULT NULL COMMENT '任务相关的建议、修改意见或其他重要备注信息', created_at BIGINT NOT NULL COMMENT '记录创建的时间戳,系统自动生成', updated_at BIGINT NOT NULL COMMENT '记录最后更新的时间戳,系统自动更新', -- 外键约束:确保user_id关联到users表的有效用户 CONSTRAINT fk_lesson_tasks_user FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE ON UPDATE CASCADE, -- 索引设计: -- 1. 用户ID索引:用于快速查找特定用户的所有任务 INDEX idx_user_id (user_id), -- 2. 进度状态索引:用于按状态筛选和统计任务 INDEX idx_progress_status (progress_status), -- 3. 课程名称索引:用于按课程分组和查询 INDEX idx_course_name (course_name), -- 4. 复合索引:用于同时按用户和状态查询 INDEX idx_user_progress (user_id, progress_status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程任务管理表:记录微课制作的完整流程,包括脚本编写、审核、视频制作等各个环节的进度和时间节点'; ``` ### 字段说明 - `id`: 任务 ID,自增主键 - `course_name`: 课程名称,不可为空 - `micro_lesson_name`: 微课名称,不可为空 - `user_id`: 负责人 ID,外键关联 users 表 - `progress_status`: 任务进度状态: - 0: 未开始 - 1: 脚本制作 - 2: 脚本审核 - 3: 脚本确认 - 4: 视频拍摄与制作 - 5: 视频确认 - `script_create_time`: 脚本开始制作的时间戳,状态 1 时记录 - `script_review_time`: 脚本提交审核的时间戳,状态 2 时记录 - `script_confirm_time`: 脚本审核通过的时间戳,状态 3 时记录 - `video_create_time`: 开始视频制作的时间戳,状态 4 时记录 - `video_confirm_time`: 视频审核通过的时间戳,状态 5 时记录 - `finish_time`: 整个任务完成的时间戳,最终确认后记录 - `advise`: 任务相关的建议、修改意见或其他重要备注信息 - `created_at`: 记录创建的时间戳,系统自动生成 - `updated_at`: 记录最后更新的时间戳,系统自动更新 ### 索引 - 主键索引:`id` - 外键索引:`idx_user_id (user_id)` - 普通索引:`idx_progress_status (progress_status)` - 普通索引:`idx_course_name (course_name)` - 复合索引:`idx_user_progress (user_id, progress_status)` ## 数据库关系 1. `users.department_id` -> `departments.id` - 一个部门可以有多个用户 - 一个用户只能属于一个部门 - 使用 RESTRICT 约束,防止删除仍有用户的部门 2. `lesson_tasks.user_id` -> `users.id` - 一个用户可以负责多个课程任务 - 一个课程任务只能有一个负责人 - 使用 CASCADE 约束,删除用户时自动删除其负责的课程任务 3. `lesson_tasks` 和 `users` 表关系: - 一对多关系:一个用户(users)可以负责多个课程任务(lesson_tasks) - 通过 `user_id` 外键关联,确保任务负责人的有效性 - 使用 CASCADE 级联删除:当用户被删除时,相关任务也会被自动删除 - 使用 CASCADE 级联更新:当用户 ID 更新时,相关任务的 user_id 也会自动更新 4. 索引说明: - `idx_user_id`: 优化按负责人查询任务的性能 - `idx_progress_status`: 优化按任务状态筛选和统计的性能 - `idx_course_name`: 优化按课程名称查询和分组的性能 - `idx_user_progress`: 优化同时按用户和任务状态查询的性能,适用于查看特定用户的特定状态任务 5. 时间节点追踪: - 系统通过各个时间戳字段(script_create_time, script_review_time 等)完整记录任务的每个阶段 - 可以通过这些时间戳计算各阶段的耗时,用于任务进度分析和效率优化 ## 注意事项 1. 所有时间戳字段使用 BIGINT 类型,存储毫秒级时间戳 2. 字符编码统一使用 utf8mb4,支持完整的 Unicode 字符集 3. 所有表都使用 InnoDB 引擎,支持事务和外键 4. 关键字段都建立了适当的索引以提高查询性能 5. 用户密码在存储前需要进行加密处理 6. 删除用户时会自动删除其关联的课程任务,但不会影响部门数据