使用复合键作为主键还是有2个外键和另一个单独的字段作为主键?

时间:2014-12-08 11:58:49

标签: sql postgresql foreign-keys primary-key composite-key

我有以下表格:

|学生|

  • studentID(P)
  • 名称
  • ...

|工作|

  • 作业ID(P)
  • JOB_NAME
  • ...

|申请|

  • 作业ID
  • StudentID
  • 的applicationID
  • ...

我应该在Application表中删除ApplicationID并使用JobID和StudentID作为复合主键,还是应该将这些作为外键并使用ApplicationID作为主键?

注意:如果它有所作为,我会应用约束,例如学生只能接受一个申请,在提出接受申请后3周等。

由于

1 个答案:

答案 0 :(得分:1)

从理论的角度来看,ApplicationID主键在这个阶段似乎是多余的(假设只有这3个表),因此您可能会想要删除它并切换到更自然的复合主键(StudentID, JobID)

但是,有两个强有力的实际反驳论点。

  1. 您的数据结构可能超出这3个表,并且在某些时候Application表本身可以从其他地方引用。这意味着引用该表的每个外键也应该是复合的,由StudentIDJobID组合,无处不在组成。

  2. SQL层之外的每个应用程序都应根据此复合主键映射到Application表,以便查看/编辑或删除其中的条目。

  3. 根据您的具体情况,您可以自行决定上述2点的强度。如果引用Application表的概率趋于0并且您不打算通过上层软件来管理它,那么复合主键就是可行的方法。在所有其他情况下,我会选择只有一个主键ApplicationID,并且对(StudentID, JobID)有一个额外的唯一约束。