如何将这种多对一的关系改为一对一

本文关键字:关系 一对一 多对一 | 更新日期: 2023-09-27 18:29:35

我有两个表,如下快照所示。

【图表】【1】

场景:一个问题应该只有一个正确答案,但可能有很多(在我的情况下是3个)错误答案(就像智力竞赛节目)。

问题:

Questions表在Answers表中有多个答案,但只有一个正确答案。正确答案是Questions表中的AnswerID,它与Answer表中的AnswerID列有关。但它显示为多对一关系(请参见粗体字段)。

我已经在Question表中对AnswerID应用了UNIQUE约束,但它仍然显示了多对一的关系。我该怎么做才能将每个AnswerID列条目链接到问题表中的单个AnswerID?还是这样可以?

谢谢

问题表:

CREATE TABLE [dbo].[Questions](
        [QuestionID] [int] NOT NULL,
        [QuestionText] [nvarchar](max) NOT NULL,
        [AnswerID] [int] UNIQUE NOT NULL,
        [ImageLocation] [ntext] NULL,
     CONSTRAINT [PK_Questions_1] PRIMARY KEY CLUSTERED 

答案表:

CREATE TABLE [dbo].[Answers](
    [AnswerID] [int] NOT NULL,
    [AnswerText] [nchar](50) NOT NULL,
    [QuestionID] [int] NOT NULL,
 CONSTRAINT [PK_Answers] PRIMARY KEY CLUSTERED 

如何将这种多对一的关系改为一对一

另一种方法:

  1. Answers表中删除QuestionID
  2. Questions表中删除AnswerID
  3. 创建一个新表QuestionAnswer(或更重要的表,如ExamTest等),该表具有QuestionIDAnswerIDIsCorrect标志
  4. 将所有Answers映射到它们的Questions,并标记哪一个是正确的

现在,您也可以重复使用其他问题的答案,并且每个问题和曾经的答案只存在一次。如果您想添加有关问答组合的其他元数据,这可能也很有用。例如:

  1. Sequence列,用于控制答案的显示顺序
  2. PointValue列,用于帮助生成最终分数或等级

我认为您不希望Questions表上有AnswerID。您可以将IsCorrect添加到答案表中,然后在QuestionIDIsCorrect之间有一个唯一的约束,当is IsCorrect为true时。

应该是正常的。

若要获得所有潜在答案,请加入Questions。QuestionID=answers.SQuestionID,若要获得唯一的正确答案,请转而加入Questions.AnswerID=AnswerID.

两个选项

  1. QUESTIONS表中创建具有UNIQUE和NOT NULL约束的外键列,该表引用ANSWERS中的UNIQUE,NOT NULL列。这将创建一个1:(0|1)关系。

  2. 删除粗体关系,并在答案表中添加IS_CORRECT_ANSWER列,以确定哪个答案是正确的

有关更多详细信息,请参阅1:1外键约束

将AnswerId PK和FK设置为Questions(QuestionId)