数据库分析 - 联结表

时间:2014-01-02 20:39:12

标签: database database-design primary-key composite-primary-key junction-table

这件事让我困惑, 我有一个学院信息系统学生表和科目(课程)表之间的联结表,主键是复合键(StudentID,SubjectID),它们都是外键,但学生可能考试不及重复这个科目所以我们将有重复的PK,我们需要记录所有数据。我有两种方法可以解决这个问题,但我不知道最好的方法吗?

  1. 将新列添加为主键而不是复合键。
  2. 加入复合键Season Column和year列,复合键将为(StudentID,SubjectID,Season,Year)。我必须提一下,我不需要这个复合键作为外键。
  3. 哪种方式更适合性能和数据库完整性?

1 个答案:

答案 0 :(得分:1)

主题和考试是分开的(如果相关的)概念,因此您不应尝试在同一个表中表示它们。此外,针对特定主题进行考试的事实与任何特定学生参加该考试的事实是分开的。将所有这些概念拆分到自己的表中,模型变得更自然,例如:

enter image description here

代表多次参加相同考试的学生只需向STUDENT_EXAM表添加多行即可。


注意:STUDENT_SUBJECT只记录学生已注册该主题的事实,但不记录(当年/学期)。保留特定学期的信息可能需要额外的表格和模型中更复杂的关系。

注意:此模型中存在菱形依赖关系。由于SUBJECT_ID从“顶部”(SUBJECT)传递,向下传递“两边”(STUDENT_SUBJECT,EXAM),然后在钻石的“底部”(STUDENT_EXAM)合并,学生无法对某个主题进行考试他还没有报名参加。