跟踪学生出勤情况的数据库设计

xan*_*xan 6 mysql database-design php

我对用于跟踪学生出勤率的数据库表的设计有疑问。目前,我的桌子students至少有4000学生。

创建一个出勤数据库来跟踪他们的出勤情况几乎会有几4000*30days*12months => ~ 1,400,000行(忽略假期/周日)。

考勤表将有:

id (INT)
student_id (INT) 
course_id (INT)
data (DATETIME)
present/absent (TINYINT, as I'll store 1/0)
comments
Run Code Online (Sandbox Code Playgroud)

我正在使用PHP/MySql. 一张桌子变得这么大,还有其他办法吗?

Cor*_*e.B 7

为了进一步了解@Twinkles 替代方案,我担心您为什么要在出勤数据中存储在场和缺席的学生。是因为您希望能够运行一份报告,显示所有孩子以及他们是否在某一天缺席?有一个更好的方法来做到这一点。

我见过的大多数系统都会存储学生在场(积极出勤)或学生缺席(消极出勤,尽管很少用该名称提及)。使用哪种方法的决定取决于学校(以及他们向谁报告)的结构和报告要求。

如果您的学校担心学生因必须跟踪逃学学生等原因而缺席,您应该使用标准(负)出勤结构。美国的大多数 K-12 学校都是这样做的。

如果您所在的学校仅在完成经过验证的学时数后才授予课程学分(例如,约翰尼在完成课程作业并参加了 12 节课后才通过课程),则可以使用积极的出勤结构.

假设您的数据如下所示:(为简单起见,忽略示例中的 course_id)

Attendance: 
id | student_id | date       | 
------------------------------
1  | 2          | 2013-10-24 | 

Students:
student_id | student_name   | 
-----------------------------
1          | Johnny Johnson |
2          | Bobby Tables   |
3          | Suzie Smith    |
Run Code Online (Sandbox Code Playgroud)

要获取您学校所有孩子的报告以及他们当天的出勤情况,您可以运行如下查询:

SELECT s.student_id, s.student_name
,  CASE WHEN a.id IS NOT NULL THEN 'Absent' ELSE 'Present' END as attendance_status
FROM Students s
LEFT JOIN Attendance a on s.student_id=a.student_id AND a.date = '2013-10-24'
Run Code Online (Sandbox Code Playgroud)

哪个会返回:

Result :
student_id | student_name   | attendance_status |
-------------------------------------------------
1          | Johnny Johnson | Present           |
2          | Bobby Tables   | Absent            |
3          | Suzie Smith    | Present           |
Run Code Online (Sandbox Code Playgroud)


小智 0

这听起来像是归档或降低粒度的好例子。我怀疑随着时间的推移,确切的数据会变得不那么相关。我个人的偏好是具有三个粒度级别:每日、每周和每年。数据超过一周后,您可以将其汇总为每周。过了一年后,总结为每年一次。我也想说每月一次,但每周的映射并不精确。