PHP-MySQL院校管理系统数据库设计咨询:支持课表、考勤标记与历史查询
校园管理系统数据库设计方案(PHP-MySQL适配)
以下设计完全匹配你提到的课表管理、考勤管理需求,兼顾查询效率和扩展灵活性:
1. 基础字典表(通用基础数据,避免重复存储)
- 院系表
department
核心字段:dept_id主键自增,dept_name院系名称,dept_code院系唯一编码 - 用户表
user(统一存储学生、教职工,用类型区分避免多表冗余)
核心字段:user_id主键自增,account登录账号,password加密存储的密码,user_type枚举值 1=学生 2=教职工,real_name真实姓名,dept_id关联所属院系,identity_no学号/工号 - 课程表
course
核心字段:course_id主键自增,course_name课程名称,course_code课程唯一编码,credit学分,dept_id开课院系 - 学期表
semester
核心字段:semester_id主键自增,semester_name学期名称(例:2024-2025学年第一学期),start_date学期开始日期,end_date学期结束日期,is_currenttinyint标识是否为当前生效学期 - 课节时段表
time_slot(统一管理每天的上课时段,避免课表重复录入时间)
核心字段:slot_id主键自增,slot_index课节序号(例:1代表上午第一大节),start_time时段开始时间,end_time时段结束时间
2. 课表核心表
- 教学班表
teaching_class(绑定课程、授课老师、学期,适配同一课程多老师开班的场景)
核心字段:class_id主键自增,course_id关联课程,semester_id关联学期,staff_id关联授课教职工的user_id - 教学班学生关联表
class_student(存储每个教学班的选课学生列表)
核心字段:id主键自增,class_id关联教学班,stu_id关联学生的user_id,建议加class_id+stu_id联合唯一索引避免重复录入 - 周课表安排表
timetable
核心字段:timetable_id主键自增,class_id关联教学班,week_day枚举值 1=周一 2=周二 ... 7=周日,slot_id关联课节时段,classroom上课教室,start_week课程开始周次,end_week课程结束周次,week_type枚举值 0=每周上课 1=单周上课 2=双周上课
课表查询逻辑:学生查课表时,先通过
class_student关联自己选的所有教学班,再关联timetable拉取对应周的课表即可;教职工查课表时,直接通过teaching_class关联自己带的教学班,再拉取timetable数据即可。
3. 考勤核心表
- 考勤记录表
attendance
核心字段:attendance_id主键自增,timetable_id关联对应的课表安排,attend_date考勤当天日期(专门用来支持按单日查询考勤的需求),stu_id关联学生user_id,status枚举值 0=缺勤 1=出勤 2=迟到 3=早退 4=请假,operate_staff_id操作考勤的教职工user_id,update_time最后修改时间
索引建议:加attend_date+operate_staff_id联合索引优化教职工单日考勤查询速度,加timetable_id+attend_date联合索引优化单节课全量考勤查询速度。
考勤操作逻辑:每次上课前批量插入该教学班所有学生的默认缺勤记录,教职工修改考勤时直接更新对应记录的
status和update_time即可,天然支持历史记录修改追溯。
常用查询示例(教职工查单日考勤)
SELECT a.attendance_id, u.real_name as stu_name, c.course_name, ts.start_time, ts.end_time, a.status, a.update_time FROM attendance a LEFT JOIN user u ON a.stu_id = u.user_id LEFT JOIN timetable t ON a.timetable_id = t.timetable_id LEFT JOIN teaching_class tc ON t.class_id = tc.class_id LEFT JOIN course c ON tc.course_id = c.course_id LEFT JOIN time_slot ts ON t.slot_id = ts.slot_id WHERE a.attend_date = '2024-10-08' AND a.operate_staff_id = 1001 ORDER BY ts.slot_index ASC
内容的提问来源于stack exchange,提问作者Mukul Mahajan
相关产品推荐
相关产品推荐

