【问题标题】:best performance database design to store students exams result存储学生考试结果的最佳性能数据库设计
【发布时间】:2014-05-01 23:42:21
【问题描述】:

以前我认为将考试数据存储在这样的简单表格中很容易:

id
subject_id
student_id
mark
date

但我注意到这是一个非常愚蠢的想法,因为它使数据库变得非常庞大 假设我们的学校有 5000 名学生,每个学生每月有 12 门科目......这意味着我们的考试表每年将包含 5000*12*10 = 600000 行,好吧,如果我们决定知道怎么办从加入日期到当前日期的学生历史 ..我认为这很愚蠢,而且我认为还有最佳解决方案可以制作另一种设计以满足我的需求.... 我需要以另一种更轻松的方式存储考试数据 提前谢谢:)

【问题讨论】:

  • 5000 名学生每个要参加 12 场考试??
  • 无论如何,您不会在此处存储任何重复数据。它占用了多少空间。没有真正“更轻松”的方式。
  • 5 年内每年 600k 行仍然只有大约 3M 行。假设每条数据记录大约 40 字节 + 一些索引,每条记录将消耗大约 100 字节的存储空间,这使我们在 5 年的活动中需要 300MB 的总数据存储空间,这绝不归类为“巨大”甚至“ big"...基本设计还可以,我会坚持下去的。
  • 您当前的设计还不错。但是,按照您的标准,我的想法会使其更加愚蠢。但是,如果在现实生活中,不同的考试对最终分数的权重不同,那将是有利的。
  • 如果您必须记录N 考试,您需要N 行。最好的设计是 3 个表格,1 个带有 student,1 个带有 exam 和 1 个与我认为您正在展示的属性的关联

标签: sql sql-server database database-design relational-database


【解决方案1】:

这是另一种方式。

Table Student 存储名称等

表主题具有诸如阅读、写作和算术之类的主题名称,可能还有一个 MinimumPassingMark。

表考试有 ExamId、ExamDate 和 SubjectID。它也可能有 PercentageOfOverallGrade

表 StudentExam 有 StudentID、ExamId 和 mark。

科目和考试有一对多的关系(一个科目可以有很多考试,每门考试都有一个科目。学生和考试有多对多的关系。

所以如果你想知道约翰尼是否会阅读,就这么简单。

select case 
when sum(mark) * PercentageOfOverallGrade >= then 'pass' else 'no' end result
from Student s join StudentExam se on s.StudentId = se.StudentId
join Subject su on se.SubjectId = su.SubjectId
where s.name = 'Johnny'
and su.name = 'Reading'

【讨论】:

    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    相关资源
    最近更新 更多