【问题标题】:SQL: can many to many relationship have a PK in addition to the FKs from the other entitiesSQL:除了来自其他实体的 FK 之外,多对多关系是否还有一个 PK
【发布时间】:2013-12-30 10:23:14
【问题描述】:

我在将考试值插入数据库时​​遇到问题,原因是考试中的每个问题都必须是唯一的,但事实并非如此,我们希望系统允许我们在 60 题考试中重复问题。我该怎么做才能做到这一点?

Exam (ExamID, Student.UID,  ExamFB, Evaluated, ExamLevel)
Primary key (ExamID)
Foreign Key (Student.UID)
Contains (ExamID, QID, X, Y, StdAnswer, CorrectAnswer, QuestionFB)
Primary key (ExamID, QID)
Question (QID, SecID, Supervisor.UID, QBody, LawID)
Primary key (QID)
Foreign key (SecID, Supervisor.UID) 

【问题讨论】:

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


    【解决方案1】:

    是的,多对多联结表不必是唯一的,尽管在您的情况下我想应该是唯一的,但我不明白为什么您会在考试中多次遇到相同的问题,但是确实如此一个很常见的场景,选择一个稍微不同的场景,想象一下汽车的服务历史,你可能有一张机械表,一张汽车表,以及一个存储每个服务的表:

    机制 - MechanicID (PK) 名称

    汽车 - CarID (PK)、RegistrationNumber、品牌、型号

    同一个技工可能会多次为同一辆车服务,因此您无法设置主键(CarID、MechanicID),因此您要么只需为服务表分配一个代理主键:

    服务 - ServiceID (PK)、CarID (FK)、MechanicID(FK)、ServiceDate

    或者在您的表中添加一个额外的列,这将使复合键唯一,例如在上面创建键(CarID、MechanicID、ServiceDate)。

    在您的情况下,您可以有一个额外的列QuestionNumber(在您的情况下为 1 - 60)来标识问题在您的考试中出现的位置,然后您的 PK 就是(ExamID,QuestionNumber),并保留外键到 QuestionID。

    因此,您的数据库图将类似于以下之一:

    【讨论】:

      【解决方案2】:

      将 IDENTITY 属性与 FK 一起添加将是您的 PK

      【讨论】:

      • 您的意思是 IDENTITY [ ( ExamID , QID , increment ) ]?我们应该将它添加到 ER 及其架构中吗?
      • 是的,将自动增量属性添加到多对多表中,以便 AutoID、ExamID 和 QID 成为您的 PK
      • 这是多余的,AutoID 无论如何都是唯一的,包括 PK 中的 ExamID 和 QID 会不必要地扩大它。
      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多