我目前有两张桌子,用于存储学生在课程中的出勤率。我有hub_attendance表,用于存储学生的总出勤率和hub_attendance_lesson,用于存储学生已经或未参加过的每节课的出勤率。我不确定这是否正确,或者我做错了什么,我是数据库的初学者!
hub_attendance:
id
student_id
course_id
total_lessons
total_lessons_so_far
total_attended
total_absent
total_excused_absent
total_late
total_excused_late
hub_attendance_lesson:
id
lesson_id
course_id
student_id
date
attended
absent
excused_absent
late
excused_late
编辑:
所以我完全摆脱了第一张桌子,这是我的新单桌。
Hub_Attendance:
id
lesson_id
course_id
student_id
date
attendance
答案 0 :(得分:3)
正如Dutchie432所说,你不需要第一个表,因为它引入了不必要的冗余,你可以动态统计这些统计数据。如果性能是一个问题,这样的聚合表可以是一个很好的解决方案,但它们应该仅作为最后的手段使用。
关于第二个表格 - 您有单独的字段attended
,absent
,excused_absent
,
late
和excused_late
。这些是否相互排斥?因此,只有其中一行可以成为一行?如果是这样,您可能会更好地使用一个名为attendance
的枚举字段,这些字段将为每个状态采用不同的值。以这种方式,你不能拥有没有设置任何标志或多个标志的行。
答案 1 :(得分:1)
以下是您的需求:
**Course**
id, name, etc...
**Lesson**
id, courseid, name, etc...
**Attendance**
id, studentid, lessonid, lateness, etc...
**Enrolment**
id, courseid, studentid, startdate, etc...
您需要注册表才能知道学生即使从未上过课程也应该参加课程。考勤表将允许您每节课有很多学生,每个学生可以上多节课。这是many-to-many table。任何聚合和计数都可以在SQL中完成。
答案 2 :(得分:0)
如果我正确理解您的架构,您的第一个表可以完全消除。您应该能够使用MySQL获取总数。
select count(id) as total_late from hub_attendance_lesson where late=true and student_id=TheUserId
答案 3 :(得分:0)
删除第一个表,每个总数都可以使用SQL获取:
SELECT count(id) AS absent
FROM hub_attendance_lesson
WHERE lesson_id = <your lesson id>
AND absent = <false / true>
我想您可以根据自己的需要调整此代码。