在线考试系统的考试安排管理是核心功能模块之一,需要存储考试的基础信息、时间安排、参与人员、考场配置等多维度数据,合理的MySQL表结构设计能保障数据查询高效、关联逻辑清晰,避免后续功能迭代时出现数据冗余或一致性问题。
考试安排管理的核心需求
设计表结构前需要先明确考试安排管理的核心功能需求,主要包括以下几个方面:
- 存储考试的基础属性,比如考试名称、考试类型、总分、及格线等
- 记录考试的时间范围,包括开始时间、结束时间、时长限制
- 关联参与考试的人员,支持按班级、按个人两种方式分配考生
- 绑定考试对应的试卷信息,明确本次考试使用的题目集合
- 记录考场相关配置,比如是否允许切屏、是否开启摄像头监控等
核心表结构设计
1. 考试基础信息表 exam_info
该表用于存储考试的核心基础信息,是所有考试安排数据的主体表,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 考试ID | 主键、自增 |
| exam_name | varchar(100) | 考试名称 | 非空 |
| exam_type | tinyint | 考试类型 1-正式考试 2-模拟考试 | 非空 |
| total_score | int | 考试总分 | 非空 |
| pass_score | int | 及格分数 | 非空 |
| paper_id | int | 关联试卷ID | 非空、外键关联试卷表 |
| start_time | datetime | 考试开始时间 | 非空 |
| end_time | datetime | 考试结束时间 | 非空 |
| duration | int | 考试时长(分钟) | 非空 |
| allow_cut_screen | tinyint | 是否允许切屏 0-不允许 1-允许 | 默认0 |
| need_camera | tinyint | 是否需要摄像头监控 0-不需要 1-需要 | 默认0 |
| status | tinyint | 考试状态 0-未发布 1-已发布 2-已结束 | 默认0 |
| create_time | datetime | 创建时间 | 默认当前时间 |
对应的建表语句如下:
CREATE TABLE `exam_info` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '考试ID', `exam_name` varchar(100) NOT NULL COMMENT '考试名称', `exam_type` tinyint NOT NULL COMMENT '考试类型 1-正式考试 2-模拟考试', `total_score` int NOT NULL COMMENT '考试总分', `pass_score` int NOT NULL COMMENT '及格分数', `paper_id` int NOT NULL COMMENT '关联试卷ID', `start_time` datetime NOT NULL COMMENT '考试开始时间', `end_time` datetime NOT NULL COMMENT '考试结束时间', `duration` int NOT NULL COMMENT '考试时长(分钟)', `allow_cut_screen` tinyint DEFAULT '0' COMMENT '是否允许切屏 0-不允许 1-允许', `need_camera` tinyint DEFAULT '0' COMMENT '是否需要摄像头监控 0-不需要 1-需要', `status` tinyint DEFAULT '0' COMMENT '考试状态 0-未发布 1-已发布 2-已结束', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', PRIMARY KEY (`id`), KEY `idx_paper_id` (`paper_id`), KEY `idx_status_start_time` (`status`,`start_time`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试基础信息表';
2. 考试考生关联表 exam_user_relation
该表用于关联考试和参与考生,支持按单个用户分配或者后续扩展按班级分配的逻辑,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 关联ID | 主键、自增 |
| exam_id | int | 考试ID | 非空、外键关联exam_info表 |
| user_id | int | 用户ID | 非空、外键关联用户表 |
| assign_time | datetime | 分配时间 | 默认当前时间 |
| UNIQUE KEY `uk_exam_user` (`exam_id`,`user_id`) | 联合唯一索引,避免重复分配 |
对应的建表语句如下:
CREATE TABLE `exam_user_relation` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '关联ID', `exam_id` int NOT NULL COMMENT '考试ID', `user_id` int NOT NULL COMMENT '用户ID', `assign_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_exam_user` (`exam_id`,`user_id`), KEY `idx_exam_id` (`exam_id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试考生关联表';
3. 考试班级关联表 exam_class_relation
如果需要支持按班级批量分配考生,可新增该表,字段设计如下:
| 字段名 | 类型 | 说明 | 约束 |
|---|---|---|---|
| id | int | 关联ID | 主键、自增 |
| exam_id | int | 考试ID | 非空、外键关联exam_info表 |
| class_id | int | 班级ID | 非空、外键关联班级表 |
| assign_time | datetime | 分配时间 | 默认当前时间 |
| UNIQUE KEY `uk_exam_class` (`exam_id`,`class_id`) | 联合唯一索引,避免重复分配 |
对应的建表语句如下:
CREATE TABLE `exam_class_relation` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '关联ID', `exam_id` int NOT NULL COMMENT '考试ID', `class_id` int NOT NULL COMMENT '班级ID', `assign_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '分配时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_exam_class` (`exam_id`,`class_id`), KEY `idx_exam_id` (`exam_id`), KEY `idx_class_id` (`class_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='考试班级关联表';
表关联查询示例
查询某场考试的所有参与考生信息,可通过以下SQL实现:
-- 查询考试ID为1的所有参与考生 SELECT u.id AS user_id, u.user_name, u.student_no, eur.assign_time FROM exam_info ei JOIN exam_user_relation eur ON ei.id = eur.exam_id JOIN user u ON eur.user_id = u.id WHERE ei.id = 1 UNION SELECT u.id AS user_id, u.user_name, u.student_no, ecr.assign_time FROM exam_info ei JOIN exam_class_relation ecr ON ei.id = ecr.exam_id JOIN class_user_relation cur ON ecr.class_id = cur.class_id JOIN user u ON cur.user_id = u.id WHERE ei.id = 1;
设计注意事项
在实际设计过程中还需要注意以下几点:
- 考试时间字段建议添加索引,方便后续按时间范围查询已发布、未开始的考试
- 考生关联表需要添加联合唯一索引,避免同一个考生重复分配到同一场考试
- 如果考试安排有修改需求,建议保留历史版本,不要直接覆盖原有数据,可通过新增版本字段实现
- 考试状态建议通过定时任务自动更新,比如到达开始时间自动改为已发布,到达结束时间自动改为已结束,避免手动维护出现误差
合理的表结构设计是在线考试系统稳定运行的基础,以上设计可根据实际业务需求灵活调整字段和关联逻辑,比如新增考试地点、监考人员等字段满足更复杂的场景需求。