【问题标题】:Database table for grades成绩数据库表
【发布时间】:2008-10-31 17:21:55
【问题描述】:

我正在尝试定义一个表格来存储在线成绩单的学生成绩。不过,我无法决定怎么做。

成绩是按学科给出的,在三个月内。每个学期都有一个平均成绩,总缺课和“恢复成绩”(我不知道英语的正确术语,但如果你低于平均水平,这是一个额外的测试,试图提高你的成绩) ,我还必须存储年平均和最终“恢复成绩”。基本上是这样的:

      |1st Trimester      |2nd Trimester      |3rd Trimester
Subj. |Avg.  |Mis.  |Rec  |Avg.  |Mis.  |Rec  |Avg.  |Mis.  |Rec  |Year Avg.  |Final Rec.
Math  |5.33  |1     |4    |8.0   |0           |7.0   |2           |6.5        |7.0
Sci.  |5.33  |1     |4    |8.0   |0           |7.0   |2           |6.5        |7.0

我可以将此信息存储在单个数据库行中,每一行如下所示:

1tAverage | 1tMissedClasses | 1tRecoveringGrade | 2tAverage | 2tMissedClasses | 2tRecoveringGrade

等等,但我认为如果学校决定按 bmester 或其他时间段(就像 3 年前以前那样)评分,这将是一种痛苦。
我还可以概括表格字段,并使用 tinyint 来标记这些成绩是哪个学期的,或者它们是否是年终总决赛。 但是这个会要求很多子查询来写成绩单,维护起来也很痛苦。

两者哪个更好,或者还有其他方法吗? 谢谢

【问题讨论】:

  • 如果是家庭作业,他不会关心维护它。虽然他有可能只是为了把我们赶走。
  • 不,工作项目,但我们是一家小公司,没有人做数据建模,我还是实习生

标签: sql database data-modeling


【解决方案1】:

您可以尝试使用您的表格来构建它。我没有所有信息,所以我猜测了您可能需要什么或如何处理这些信息。

时间段:

  • ID(INT)
  • PeriodTimeStart(DateTime)
  • PeriodTimeEnd(DateTime)
  • 名称(VARCHAR(50)

学生:

  • ID(INT)
  • 名字(VARCHAR(60))
  • 姓(VARCHAR(60))
  • 生日(日期时间)
  • [任何其他相关的学生领域 添加的信息...如联系方式 信息等]

分级:

  • ID(INT)
  • 学号(INT)
  • GradeValue(float)
  • TimePeriodID(INT)
  • IsRecoveringGrade(boolean)

错过的课程:

  • ID(INT)
  • 学号(INT)
  • 类ID(INT)
  • TimePeriodID(INT)
  • DateMissed(DateTime)

类:

  • ID(INT)
  • 类名 (VARCHAR(50))
  • 类描述(文本)

【讨论】:

  • 虽然项目不需要所有这些表,但像这样分离数据似乎是最好的解决方案。维修困难的可能性要小得多。谢谢 Handruin
  • 没问题。你说你不希望维持它是一种痛苦……我试图用给出的信息尽可能多地正常化。这种结构将允许它成长。您不会有很多子查询来获取成绩单。如果您需要示例查询,请询问您需要的数据。
【解决方案2】:

我认为最好的解决方案是每个周期存储一行。所以你会有一个像这样的表:

grades
------
studentID
periodNumber
averageGrade
missedClasses
recoveringGrade

因此,如果是 2 个学期,您将有第 1 和第 2 期。我建议使用第 0 期来表示“全年的总体”。

【讨论】:

    【解决方案3】:

    最好有第二个代表学期的表,并有一个从成绩表中指向学期的外键引用(并将各个成绩存储在成绩表中)。然后使用 SQL 函数 SUM 和 AVG 计算平均值、错过的课程等。

    【讨论】:

    • 这取决于您需要 GPA 的频率。如果你需要它们很多,你会增加很多额外的计算时间。一旦一个术语超过 GPA,就可以预先计算并存储该术语的 GPA,以便更轻松/更快/更轻松地检索。
    • @Stimy - 您正在尝试解决一个可能不存在的问题。大多数 RDBMS 都非常擅长计算聚合。非规范化数据库是一个非常糟糕的主意,因为您认为可能存在性能问题。除非学校有数百万学生,否则标准化的数据库应该是好的。
    • 我省略了编译聚合,但可以根据上面示例中的 TimePeriod 轻松添加一个新表来存储它们。它们可以在时间段结束时由触发器或计划任务生成,然后存储。就像汤姆说的,这取决于学生的数量和使用情况。
    • 另外,这不是学校系统。这只是他们网站的成绩单。不过,我无法访问他们的系统,所以我必须定义一个由 CSV 文件提供的小型评分系统。为什么我们不能只使用他们的数据库超出我的理解,从未见过他们的系统......
    【解决方案4】:

    This comes to mind.

    (但是说真的,错误的是桌子太多,而不是太少。Handruin 有我迄今为止看到的最好的解决方案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多