我的数据包含问题和答案。它还显示了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而不是问题的信息。
答案 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放在问题记录中。