对于一个从数据库和系统开发开始的小型初学者项目,我正在尝试开发一个系统,它代表了学生和考试管理系统的典型案例。这是基于以下图表:

两个简单的实体--学生和考试--不会给我带来任何问题,但我很难找到最好的方法来解决两者之间的多到多的关系。我意识到我必须为此创建一个额外的表,但是我不确定我是应该选择一个3-4属性的复合键还是一个具有唯一ID的人工键。
复合键:

使用此解决方案,其思想是通过MatriculationNumber、ExamID和Date来识别测试结果。在我看来,这个日期也必须加到钥匙上,因为有可能考试还没有通过,必须在系统中进行管理。因此,MatriculationNumber和ExamID不足以唯一地确定两个已完成的考试。然而,我也想出了一个极端的例子:如果考试和补考日期(不管出于什么原因)在同一天进行,并且都有相同的分数,比如5.0,那会发生什么呢?那就不可能区分这两件事了。如果必须考虑到第三次尝试,整个过程就会变得更加困难。
人工身份证:

在这种情况下,将创建一个新的人工ID,以便唯一地确定每个结果。但是,第一个解决方案没有隐含的优势,例如,它只允许每个考试和学生以及标签输入一个条目。然而,我希望我的解决方案尽可能灵活,而不是让数据库的设计决定我的专业精神。
总的来说,我想从你的专家那里知道这两种解决方案中哪一种更适合我的应用。即使一名学生在同一天考试失败,也有可能取消几次相同考试的尝试。我不想让数据库口述或限制主题。还应该可以根据我在复合密钥中发现的相当困难的内容构建一个REST,至少在我在网络上看到了这些之后。在你看来,解决这个问题的最佳实践是什么?
编辑
为了更好地描述总体情况,还有几个细节:对于实现,我想使用一个postgreSQL数据库。因为这只是一个简单的介绍示例,没有存储数十亿条记录,也不需要时间紧迫的操作,所以重点根本不放在性能上。但是,我发现更重要的是以后能够扩展应用程序和业务逻辑,例如通过存储文档或其他信息。我不希望有一个特性破坏我的数据库或API的完整结构。我在这里主要担心的是,如果我想要使用合并的键在解决方案中提供更多信息,我就必须进行这样的基本更改。另一方面,我仍然缺乏一个明确的说明或理由,为什么我应该引入一个人工身份证,它的优点是什么?
发布于 2018-12-03 14:15:00
基于以下原因,我建议使用人工密钥ResultID:
WHERE ResultID IN (id1, id2, ...)或ResultID IN (... subquery ...)。不能同时对多列PK的所有值使用IN。TestResult定义新的关系都会更容易.假设您需要管理TestResult表中的"Retake结果“,该表指向以前的结果。对于单列PK,只需添加一个列PreviousResultId。使用3-ColumPK,您将被设置为创建一个3列关系混乱(IMO)。https://dba.stackexchange.com/questions/223995
复制相似问题