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. 一张桌子变得这么大,还有其他办法吗?
为了进一步了解@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
这听起来像是归档或降低粒度的好例子。我怀疑随着时间的推移,确切的数据会变得不那么相关。我个人的偏好是具有三个粒度级别:每日、每周和每年。数据超过一周后,您可以将其汇总为每周。过了一年后,总结为每年一次。我也想说每月一次,但每周的映射并不精确。
| 归档时间: |
|
| 查看次数: |
31014 次 |
| 最近记录: |