2013-08-30 59 views
5

我有两张表,如下面的快照。如何将这种多对一的关系改变为一对一的关系?

[图表] [1]

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

问题:

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

我对问题表中的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 
+0

为什么不简单地在你的答案表中添加一个标志(RigtAnswer)?这将为您节省额外支票(正确的答案不在可能的答案列表中......) –

+0

请向我们展示您的FOREING KEY脚本。 –

+0

@MauricioGracia我添加了一个来自SQL管理工作室的屏幕截图 –

回答

4

另一种方法:

  1. QuestionIDAnswers表。
  2. Questions表中删除AnswerID列。
  3. 创建新表,QuestionAnswer(或东西更有实际意义,比如ExamTest等),其中有一个QuestionID,一个AnswerIDIsCorrect标志。
  4. 将全部Answers映射到它们的Questions,并标记哪一个是正确的。

现在,您可以重新使用了其他问题的答案为好,每一个问题和回答永远只存在一次。如果您想添加有关问题答案组合的其他元数据,这也可能很有用。例如:

  1. A Sequence列控制答案出现的顺序。
  2. A PointValue专栏帮助产生最终得分或等级。
+0

谢谢。我更喜欢这种方法。它的可重用性和感觉更“正常化”给我。 –

+0

这种方法没有增加“将[布尔isCorrect]添加到答案”方法(该方法*也使*有多个正确的答案)的好处。此外,这种方法会使删除答案成为一种痛苦(如果您可以安全地删除答案,则可能无法确定,因为另一个用户输入的另一个尚未提交的问题可能引用了您即将删除的答案),而不是提到复杂的用户界面,以便重新使用Answers。将逻辑上拥有的关系转换为无主的关系只会让你的生活变得更难,而不是更容易。 –

4

您是否想在Questions表中AnswerID我不认为。您可以将IsCorrect添加到答案表中,然后在QuestionIDIsCorrect之间有一个唯一约束,当IsCorrect为真时。

+0

是的,或者如果你不想在你的答案表中有重复的答案,你可以在'Questions'表中添加一个CorrectAnswerID。 – Khan

+0

这也可以避免在所有答案的范围之外拥有正确的AnswerId的错误,该错误充当约束,并且即使在数据库级别也使模型保持一致。 –

+0

@Reimius如果您创建一个已过滤的索引并使其唯一,则不成立。 –

1

它应该可以。

要获得所有可能的答案,请加入Questions.QuestionID = Answers.QuestionID,以获取唯一正确的anser,而不是加入到Questions.AnswerID = Answers.AnswerID。

1

两个选项

  1. 创建与惟一外键列,然后从质询表引用UNIQUE,NOT NULL列NOT NULL约束真题答案表。这会创建1:(0 | 1)关系。

  2. 取出粗体关系和IS_CORRECT_ANSWER列添加到你的答案表以确定哪个答案是正确的

欲了解更多详情,请参阅 1:1 Foreign Key Constraints

0

回答表设置AnswerId PK和FK问题(问题Id)