如何使这个数据库架构更好?

时间:2012-03-20 10:11:07

标签: php mysql database moodle

我目前有两张桌子,用于存储学生在课程中的出勤率。我有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

4 个答案:

答案 0 :(得分:3)

正如Dutchie432所说,你不需要第一个表,因为它引入了不必要的冗余,你可以动态统计这些统计数据。如果性能是一个问题,这样的聚合表可以是一个很好的解决方案,但它们应该仅作为最后的手段使用。

关于第二个表格 - 您有单独的字段attendedabsentexcused_absentlateexcused_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>

我想您可以根据自己的需要调整此代码。