在学校管理系统中,我们需要为每个学生纳入3个学期的分数。
经过讨论,我想出了两个解决方案。解决方案1
为每个学期创建3个表。 (gradeSemester1,gradeSemester2,gradeSemester3)
解决方案2
创建一个名为semesterGrades的表,并使用一个类型处理所有3个学期。
解决方案1的原因是停止数据复制。例如,如果学生有8个科目。这只能包含一个表中的8条记录,其中在解决方案2中它最多可包含一个学生的24条记录。
当性能成为主要问题时,最佳解决方案是什么?为什么解决方案2更好?
答案 0 :(得分:3)
您不希望根据数据更改数据库结构,因此在需要新学期时创建新表是糟糕的设计。 您只需要一个额外的表来存储成绩。但是我个人不会将它们存储在列中,而是在行中更灵活(可能有一天你想要的只是3个学期的成绩)。
表格如下所示:
ID | StudentID | SemesterID | SubjectID | Grade
这种方法的另一个优点是你知道一个等级属于哪个学期。如果您有三个等级的专栏,您只知道成绩,但您没有关于该学期的信息(我猜他可能需要超过3个学期)。
我也不担心这种方法的表现。您必须将表连接在一起,但设置了适当的索引,这应该不是问题。
答案 1 :(得分:0)
连接表比单个选择更昂贵,因为在连接中你选择并然后配对以创建一个巨大的表。
为什么不解决方案3:
创建1个包含3列的表(每个学期一个)。无论如何,这实际上是你的联盟将要做的事情。是否有任何理由将它们分开?
编辑(解释): 除非我误解了什么......
此表格中的单行会将学生与主题相关联,并且可以包含三列(每个学期成绩一列)。假设你有一个学生桌和另一个主题表。该表中包含三个学期的成绩仍将进行标准化。
TABLE
----------------------
student_id
subject_id
semester1grade
semester2grade
semester3grade