重复群的归一化

时间:2015-01-26 11:55:24

标签: database database-design relational-database primary-key normalization

我的数据包含问题和答案。它还显示了versionNr的答案,并显示哪些人更改了哪个答案。 某些问题可能有相同的答案。

questionID    Question      Answer       VersionNr    User            date
     1        Who is....?   W.H. Smith     1.0        ...@test.com   1/1/14          
                                           1.1        ...@test.com   3/8/14

     2        What is...?   3%             1.0        ...@test.com   1/2/14

RG =重复组
粗体=复合/主键

0NF:
questionID ,问题,答案ID,答案,RG {versionNr,用户,日期}

1NF:
questionID ,问题,答案ID,答案)
(questionID, AnswerID VersionNr ,用户,日期)

2NF / 3NF:
问( questionID ,问题,答案ID)
答案(答案ID ,答案)
版本(questionID, AnswerID VersionNr ,用户,日期)

我的问题是我是否应该从Version中删除questionID,因为versionNr,date和User提供了有关Answer而不是问题的信息。

2 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,我相信您可以执行以下操作来实现有效的3NF架构。

问( questionID ,问题)

答(的 AnswerID 下,答案, QuestionID

版(的 VersionNr ,<强> AnswerID 用户下,日期)

(斜体是外键)

因此,版本的主键是triple {VersionNr,AnswerID,User)。请解释我的解决方案是否有问题。

所以,总而言之,不,你不需要在版本中包含questionID,因为你可以通过连接找到它。

<强>更新

我想我理解你的问题,我相信正确的解决方案如下。

Q(的 questionID 下,问题)

答(的 AnswerID 下,回答)

版(的 QuestionID ,<强> AnswerID 下,VersionNr,用户,日期)

实际上,你的答案和问题之间的关系很多,因为很多答案都与很多问题有关。因此,您可以使用Version作为中间表来构建这种多对多的关系。

此外,您可以在该中间表中添加版本号,用户和日期,以获取所有必要信息。

答案 1 :(得分:0)

如果一个答案记录可以有许多版本记录,那么是的,QuestionID不应该是版本,因为它是冗余数据:你总是可以通过查找答案记录告诉版本的QuestionID。

那就是说,我不清楚你想要建模的是什么。当您说用户可以更改答案时,您的意思是这是一个测验,用户可以更改&#34;正确答案&#34;是什么?或者你的意思是他们可以改变他们给测验或调查的答案吗?

但是,如果一个答案中有许多版本记录,那么您只是记录了每个步骤的答案,您只是记录了进行更改的人员。也许这就是你需要了解的所有目的。但如果想要记录每个版本的答案,那么答案和版本应该合并为一个表格。在这种情况下,您需要在答案/版本记录中使用questionID,否则您无法知道哪个问题除了最新答案之外的任何答案。

如果想法是每个问题只有一个答案记录,然后是许多版本,那么问题和答案应该合并为一个记录。好吧,你说几个问题可以分享相同的答案。正如我在评论中提到的,这是什么意思?你是在谈论巧合的答案,比如问题是&#34; 2 + 2是多少?&#34;另一个是&#34; 16的平方根是什么?&#34;这两个答案恰好是4?或者你的意思是,如果一个问题的答案发生了变化,另一个问题的答案在逻辑上和不可避免地必须改变为同一个问题,那么它们的答案实际上是相同的答案。比如,&#34;谁是现任美国副总统?&#34;和#34;如果美国总统去世,谁将成为总统?&#34;

我认为逻辑架构是这样的:

Question (questionID, question_text)
Answer (answerID, questionID, version_number, answer_text, user, change_date)

然后当前的答案是

select answer_text
from answer
where questionID=@qid
  and version_number=(select max(version_number) from answer
    where questionID=@qid)

这不需要冗余数据。

性能和简单性的明显非规范化是将当前答案的answerID放在问题记录中。