学校课程表数据库模型设计求助:适配新增业务需求
课程表数据库模型设计方案
核心思路
将周期性课程模板与实际排定的单节课分离存储,解决原模型中系列课程与单节实例绑定过紧的问题,同时满足打分、系列编辑、单节调整的需求。
完整表结构设计
1. 基础实体表(保留原有设计)
Subjects id: int (主键) name: string (科目名称,如English、Programming)
Groups id: int (主键) name: string (群组名称,如A组、B组)
2. 周期性课程模板表
存储课程的重复规则,用于生成默认的排课实例:
LessonTemplates id: int (主键) subject_id: int (外键关联Subjects.id) group_id: int (外键关联Groups.id) name: string (课程系列名称,如"A组编程课") start_date: date (系列开始日期) end_date: date (系列结束日期) start_time: time (默认开始时间) end_time: time (默认结束时间) day_of_week: enum (Monday-Sunday,默认每周授课日) repeat_type: enum (可选,如weekly/monthly,按需扩展)
3. 实际排课实例表
存储每一节具体的课程,包括模板自动生成的和手动调整的:
ScheduledLessons id: int (主键) template_id: int (外键关联LessonTemplates.id,为空则为独立课) actual_date: date (实际授课日期) actual_start_time: time (实际开始时间) actual_end_time: time (实际结束时间) is_custom: boolean (标记是否为手动调整的课程,默认false) status: enum (可选,如scheduled/finished/canceled,标记课程状态)
4. 成绩表
与实际排课实例绑定,确保成绩与具体授课事件关联:
Grades id: int (主键) scheduled_lesson_id: int (外键关联ScheduledLessons.id) user_id: int (关联学生ID) grade: int? (分数,可为空表示未打分) comment: string (可选,评语)
需求适配说明
1. 为单节课打分
成绩直接关联ScheduledLessons的具体实例,无论后续模板或其他课程如何调整,已录入的成绩始终对应实际发生的那节课,不会出现日期不匹配的问题。
2. 编辑整个课程系列
- 修改
LessonTemplates中的规则(如提前1小时、更改授课日) - 批量更新所有未发生且is_custom=false的
ScheduledLessons,将其实际时间/日期同步为新规则 - 已完成的课程(status=finished)或手动调整过的课程(is_custom=true)保持不变,避免影响已录入的成绩
3. 调整系列中的单节课程
直接修改对应ScheduledLessons的actual_date/actual_start_time/actual_end_time,并将is_custom设为true。后续修改模板规则时,该课程不会被批量更新,独立保留调整后的状态。
额外优化建议
- 新增
LessonTemplateHistory表,记录模板的修改历史,便于回溯系列课程的变更过程 - 在创建模板时,可预先生成所有
ScheduledLessons实例,也可按需动态生成(如查询时生成未来的课程),根据性能需求选择
内容的提问来源于stack exchange,提问作者student
相关产品推荐
相关产品推荐

