如何将这种多对一的关系改为一对一?
Posted
技术标签:
【中文标题】如何将这种多对一的关系改为一对一?【英文标题】:How to change this many to one relationship to one to one? 【发布时间】:2013-08-30 13:30:21 【问题描述】:我有两张表,如下图所示。
![图表][1]
场景: 一个问题应该只有一个正确答案,但可以有很多(在我的例子中是 3 个)错误答案(比如问答节目)。
问题:
Questions
表在Answers
表中有多个答案,但只有一个正确答案。正确答案是Questions
表中的AnswerID
,它与Answer
表中的AnswerID
列有关。但它显示为多对一关系(请参阅粗体字段)。
我已对 Question 表中的 AnswerID 应用了 UNIQUE 约束,但它仍然显示多对一关系。我该怎么做才能使每个 AnswerID 列条目链接到 Question 表中的单个 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
【问题讨论】:
为什么不简单地在答案表中添加一个标志 (RigtAnswer)?这将使您免于额外检查(正确答案不在可能的答案列表中......) 请也向我们展示您的 FOREING KEY 脚本。 @MauricioGracia 我添加了来自 SQL 管理工作室的屏幕截图 @iAteABug_And_iLiked_it 看看我的回答,看看它是否是你要找的东西 我没有正确阅读这一行:Questions 表在 Answers 表中有多个答案,但只有一个正确答案。 AnswerId 误导了我,因为它应该是 CorrectAnswerId,这表明存在多个答案。以为是一个问题,一个答案。因此我删除了我的答案。 【参考方案1】:另一种方法:
-
从
Answers
表中删除QuestionID
。
从Questions
表中删除AnswerID
列。
创建一个新表,QuestionAnswer
(或更有意义的东西,如Exam
、Test
等),它有一个QuestionID
、一个AnswerID
和一个IsCorrect
标志。
将所有Answers
映射到它们的Questions
,并标记哪个是正确的。
现在您也可以重复使用其他问题的答案,并且每个问题和曾经的答案都只存在一次。如果您想添加有关问题答案组合的其他元数据,它也可能很有用。例如:
Sequence
列用于控制答案出现的顺序。
PointValue
列可帮助生成最终分数或成绩。
【讨论】:
谢谢。我更喜欢这种方法。它可重复使用,对我来说感觉更“正常化”。 这种方法对“将 [bool isCorrect] 添加到答案”方法(也可以有多个正确答案)没有任何好处。此外,这种方法使删除答案很痛苦(您永远无法确定是否可以安全地删除答案,因为另一个用户输入的另一个尚未提交的问题可能正在引用您将要删除的答案),而不是提到启用 Answers 重用的复杂 UI。将逻辑上拥有的关系转换为无拥有的关系只会让你的生活更艰难,而不是更轻松。【参考方案2】:我认为您不希望在 Questions
表上使用 AnswerID
。您可以将IsCorrect
添加到答案表中,然后在QuestionID
和IsCorrect
之间有一个唯一约束,IsCorrect
何时为真。
【讨论】:
正确,或者如果您不想在答案表中出现重复的答案,您可以将CorrectAnswerID
添加到Questions
表中。
这也防止了正确的 AnswerId 超出所有答案范围的错误,这充当了约束并使模型即使在数据库级别上也保持一致。
@Reimius 如果您创建过滤索引并使其唯一,则不正确。
看起来问题已更新以解决该问题。【参考方案3】:
应该没问题。
要获得您在 Questions.QuestionID=Answers.QuestionID 上加入的所有潜在答案,要获得唯一正确的答案,您可以在 Questions.AnswerID=Answers.AnswerID 上加入。
【讨论】:
【参考方案4】:两种选择
使用 QUESTIONS 表中的 UNIQUE 和 NOT NULL 约束创建外键列,该表引用 UNIQUE,NOT NULL 列在 ANSWERS 表中。这将创建一个 1:(0|1) 关系。
删除粗体关系并将 IS_CORRECT_ANSWER 列添加到您的答案表中以确定哪个答案是正确的
更多详情见 1:1 Foreign Key Constraints
【讨论】:
【参考方案5】:Answer 表将 AnswerId PK 和 FK 设置为 Questions(QuestionId)
【讨论】:
以上是关于如何将这种多对一的关系改为一对一?的主要内容,如果未能解决你的问题,请参考以下文章