You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_current tinyint标识是否为当前生效学期
  • 课节时段表 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 19:45:03