我们在MySQL中有一个table attendance_details,其中包含五门课程的出勤详情。该表有数百万条记录。
表结构是
training_date - date on which training happened
student_id - id of the student
course1 - no of hrs attended
course2 - no of hrs attended
course3 - no of hrs attended
course4 - no of hrs attended
course5 - no of hrs attended
我需要将信息公开给另一个会查询出勤详情的应用。 并且查询模式总是"给定的学生是否在date1和date2之间全天参加课程?" 如果学生当天至少上课一小时,那么它将被视为有人参加。
结果可能是
我需要在新表中以简化的方式提供数据,以便其他应用程序可以通过查询获取详细信息。
我的目标是
约束:
以下是我的尝试
表代表第一个&上次出勤日期,第一次和最后缺席日期
+------------+------------------+-----------------+--------------+------------------------+ | student_id | first_attendance | last_attendance | first_absent | last_absent | +------------+------------------+-----------------+--------------+------------------------+ | 123 | 2015-01-01 | 2015-01-30 | 2015-01-15 | 2015-01-21 | +------------+------------------+-----------------+--------------+------------------------+
在上表设计中,日期特定于课程。因此我需要4道x4列,共16列。如果我添加更多课程,这将会增加。
还试图将每个月的记录表示为位图,但这会使编程逻辑变得复杂。
答案 0 :(得分:0)
我会说你很亲密。
让我们回顾一下这些关系。
让我们先看一下对象表。我假设数据库中已有Student表和Course表。
第一个表是学生和课程的联结表。
StudentCourse
-------------
Student ID
Course ID
Course Started Date
Course Ended Date
主键是(学生ID,课程ID)。这使我们可以查询学生正在上的课程。我们还有一个唯一的索引(课程ID,学生证)。这使我们可以查询参加课程的学生。
现在我们已经确定了课程的开始和结束日期,我们可以记录每个学生的出勤率,
我们还需要一个班来完成关系,出勤。这是出勤率的样子。
Attendance
----------
Student ID
Course ID
Start Date
End Date
Is Present
此表的主键为(学生ID,课程ID,开始日期)。 (课程ID,学生ID,开课日期)上还有一个唯一索引。
这里的想法是,对于每个学生,您创建足够的行来描述学生在特定日期范围内的存在与否。如果您想让这更容易,请从表中删除结束日期,并且您将为该类的每个日期添加一行。
我不确定你的示例行告诉我什么,但这就是我的意思。
Student ID Course ID Start Date End Date Is Present
123 456 2015-01-01 2015-01-14 true
123 456 2015-01-15 2015-01-21 false
123 456 2015-01-22 2015-01-31 true
由于涵盖了所有日期,因此您可以使用SQL子句WHERE“开始日期”查询日期和日期以获取所需的行。