如何以简化形式表示大型数据集

时间:2015-10-23 07:05:28

标签: mysql database-design

我们在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之间全天参加课程?" 如果学生当天至少上课一小时,那么它将被视为有人参加。

结果可能是

  1. 在date1和date2之间全天出席
  2. 在date1和date2之间参加,但缺席了几天
  3. 在date1和date2
  4. 之间根本没有出现

    我需要在新表中以简化的方式提供数据,以便其他应用程序可以通过查询获取详细信息。

    我的目标是

    1. 减少否。记录基本上在新表中,以便查询可以快速运行。 更快的查询是主要目标
    2. 数据模型应该更容易查询
    3. 约束:

      1. 我不想公开attendance_details,只是因为它很庞大并且具有高度的交易性。
      2. 不可能使用attendance_details的结构。
      3. 以下是我的尝试

        表代表第一个&上次出勤日期,第一次和最后缺席日期

         +------------+------------------+-----------------+--------------+------------------------+
        | 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列。如果我添加更多课程,这将会增加。

        还试图将每个月的记录表示为位图,但这会使编程逻辑变得复杂。

1 个答案:

答案 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“开始日期”查询日期和日期以获取所需的行。