- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 4 个学期的学生,我很关心他们每个科目的出勤率。不同学期的学生被分组。每个批处理都可以选择从 36 个受试者中选择一个受试者。
首先,我创建了一个表subject
,其中我列出了四个批处理的所有主题以及主题代码。我有另一个表 student
,其中有 studentid
和 6 列,其中包含学生选择的主题代码。通过执行连接,我可以知道学生选择了哪个科目。
现在我无法弄清楚如何以干净的方式存储每日出勤率。请提供一种方法,因为我需要存储 365 天和 1500 多个学生的数据。 (部分批处理周日不放假)。
我发现很少有相关主题,包括 Storing attendance records in the database和其他一些人,但我找不到解决方案。
最佳答案
我会有这样的东西:
Subjects( SubjectId PK, Name, etc... )
Classes( ClassId PK, SubjectId, DateTime periodBegin, etc... )
Students( StudentId PK, Name, etc... )
StudentAttendance( StudentId PK, ClassId PK )
Subjects
包含每个科目的记录,Classes
包含学校日历中每个预定类(class)的记录。 Classes
表将需要填充实际的类(class)集合 - 您可以在它们发生时添加它们,也可以在学年开始时批量添加它们。 Students
表是不言自明的,StudentAttendance
表列出了哪些学生积极参加了特定类(class)。
不要认为像 StudentAttendance
这样的表是糟糕的设计 - 这是多对多连接表的典型示例。一些数据库在连接表中有数十亿行并不罕见,但因为它只包含两个键值(大概是 int32 或 int64),所以它不会占用太多磁盘空间。
下面是一个查找哪些学生没有参加特定类(class)的查询:
SELECT
Name
FROM
Students
WHERE
StudentId NOT IN (
SELECT
StudentId
FROM
StudentAttendance
INNER JOIN Classes ON StudentAttendance.ClassId = Classes.ClassId
WHERE
StudentAttendance.ClassId = @classId
)
这是一个查询,它获取每个参加特定科目的学生的出勤率。将其除以 ( SELECT Count(*) FROM Classes WHERE Classes.SubjectId = @subject
) 得到每个学生的出勤率。如果学生从未参加过任何类(class)(故意或因为他们没有注册),那么他们将不会出现在列表中。
SELECT
Students.Name
COUNT(*) As AttendanceCount
FROM
StudentAttendance
INNER JOIN Classes ON Classes.ClassId = StudentAttendance.ClassId
INNER JOIN Students ON Students.StudentId = StudentAttendance.StudentId
GROUP BY
StudentId
WHERE
Classes.SubjectId = @subjectId
关于database - 将出勤率存储在数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15050102/
我是一名优秀的程序员,十分优秀!