如何将这种多对一的关系改为一对一
本文关键字:关系 一对一 多对一 | 更新日期: 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
另一种方法:
- 从
Answers
表中删除QuestionID
- 从
Questions
表中删除AnswerID
列 - 创建一个新表
QuestionAnswer
(或更重要的表,如Exam
、Test
等),该表具有QuestionID
、AnswerID
和IsCorrect
标志 - 将所有
Answers
映射到它们的Questions
,并标记哪一个是正确的
现在,您也可以重复使用其他问题的答案,并且每个问题和曾经的答案只存在一次。如果您想添加有关问答组合的其他元数据,这可能也很有用。例如:
Sequence
列,用于控制答案的显示顺序PointValue
列,用于帮助生成最终分数或等级
我认为您不希望Questions
表上有AnswerID
。您可以将IsCorrect
添加到答案表中,然后在QuestionID
和IsCorrect
之间有一个唯一的约束,当is IsCorrect
为true时。
应该是正常的。
若要获得所有潜在答案,请加入Questions。QuestionID=answers.SQuestionID,若要获得唯一的正确答案,请转而加入Questions.AnswerID=AnswerID.
两个选项
-
从QUESTIONS表中创建具有UNIQUE和NOT NULL约束的外键列,该表引用ANSWERS中的UNIQUE,NOT NULL列。这将创建一个1:(0|1)关系。
-
删除粗体关系,并在答案表中添加IS_CORRECT_ANSWER列,以确定哪个答案是正确的
有关更多详细信息,请参阅1:1外键约束
将AnswerId PK和FK设置为Questions(QuestionId)