我有一个表,其中包含学生成绩记录,这些记录与通过班级记录表创建的ID分组。

它具有三个评分成分,即书面作品,绩效任务和季度考试,每个成分都有自己的成分权重,具体取决于科目类型(例如,一种科目类型的书面作品占期末成绩的25%,绩效任务占季度成绩的45%,每季度考试30%)

但是,这些组件的权重可能会发生变化,这就是我想要做的。

我如何确保新的组件权重仅影响新创建的班级记录(下学年等创建),而旧的班级记录将保持创建时处于活动状态的组件权重。

这是表格的样子(列名不是那么长,但是我只使用完整的单词以便于理解)

            classrecord
            -ClassID
            -SubjectID
            -SchoolyearID
            -MaxWrittenWorksGrade
            -MaxPerformanceTaskGrade
            -MaxQuarterlyExaminationGrade

            grades
            -RecordID
            -StudentID
            -ClassID
            -WrittenWorksGrade
            -PerformanceTaskGrade
            -QuarterlyExaminationGrade
            -FinalGrade

            subjects
            -SubjectID
            -SubjectName
            -SubjectTypeID

            subjecttype
            -SubjectTypeID
            -SubjectTypeName
            -SubjectTypeWeightID

            subjtypeweight
            -SubjectTypeWeightID
            -WrittenWorksWeight
            -PerformanceTaskWeight
            -QuarterlyExaminationWeight


如您所见,在计算过程中,表subjtypeweight通过classrecord> subject> subjtype> subjtypeweight引用

我只是一名学生,我想出的设计可能会出现问题,但是我很高兴能提供反馈以改善这一点。

非常感谢您与我保持联系,我很难解释我的要求,所以请问我问题中是否有任何令人困惑或遗漏的内容,谢谢。

最佳答案

这是一个经典的基于时间的数据问题。

看起来您的subjtypeweight表包含具有开始和结束生效日期的行。该表的每一行可能只有效一年。然后,您可以在该表中添加SchoolyearID列,并使该表的主键成为SubjectTypeWeightID, SchoolyearID的组合。然后,使用包含一系列JOINs的查询,如下所示。

 FROM classrecord c
 JOIN subjects s ON c.ClassID = s.ClassID
 JOIN subjecttype st ON s.SubjectTypeID = st.SubjectTypeID
 JOIN subjtypeweight stw ON st.SubjectTypeWeightID = stw.SubjectTypeWeightID
                        AND c.SchoolyearID = stw.SchoolyearID


请注意最后一个ON子句的两部分,由AND连接。他们将从您的subjtypeweight表中提取正确的行。

您需要为每个新学年插入新的subjtypeweight行,才能使用此方法。通过在subjtypeweight中添加而不是添加两列(SchoolyearIDLastSchoolyearID),您可以摆脱每年这样做的麻烦。允许LastSchoolyearId包含空值。然后在查询中使用它。

 FROM classrecord c
 JOIN subjects s ON c.ClassID = s.ClassID
 JOIN subjecttype st ON s.SubjectTypeID = st.SubjectTypeID
 JOIN subjtypeweight stw
         ON st.SubjectTypeWeightID = stw.SubjectTypeWeightID
        AND c.SchoolyearID >= stw.SchoolyearID
        AND (stw.LastSchoolyearID IS NULL OR c.SchoolyearID <= stw.LastSchoolyearID)


那是一个复杂的ON子句。但这是为了根据有效期的第一年和最后一年(如果有)从subjtypeweight列中选择正确的行。

如果要更新权重,请通过显示有效的上一个学年来更新现有行以“退休”它。然后插入新行,显示该行有效的第一年。 (不要让您的有效年份重叠,否则您的JOIN操作将产生太多记录。)

不用担心性能。 SQL是为此编写的。

我是通过阅读Richard Snodgrass教授关于在SQL中开发基于时间的应用程序的书中学到的。 Snodgrass博士慷慨地将其以PDF格式提供。 https://www2.cs.arizona.edu/~rts/publications.html

08-27 01:14