2011-03-17 48 views
0

我有一个测验应用程序。随后数据库开发的正常模式数据库设计问题(RAILS)

测验 - > QuizQuestions - > QuizQuestionChoices

QuizAttempt - > QuizAttemptAnswer

在quiz_attempt_answers我的回答存储为一个字符串,而不是一个参考QuizQuestionChoices为原因如下。

  1. 如果问题会从测验(也许它测验被修订)中删除,我们不希望失去他们把豆。
  2. 如果选择得到改变或重新安排,我们希望有他们选择的答案是

这些正确的理由是不使用外键作为答案吗?

回答

1

我会继续你的方法,但也存储关联。

所以......

class QuizQuestionChoice < ActiveRecord::Base 
    has_many :quiz_attempt_answers, :dependent => :nullify 
end 

class QuizAttemptAnswer < ActiveRecord::Base 
    belongs_to :quiz_question_choice 
end 

如果QuizQuestionChoice被删除foreign_key设置为null,你还有自己的实际回答这个问题的方式。

有些情况下,您甚至可以将原始问题与答案一起存储。如果有人改变了无意中改变其意义的措词。

+0

这可能是查看NoSQL数据库的好例子 – lebreeze 2011-03-17 21:00:58

0

只是为了回答你最后一个问题,它们不是特别有效的原因,但仅仅是因为有很多好的选择。当然,这总是取决于你的情况,你将来如何计划使用这些数据,实现替代方案有多简单,等等等等......

lebreeze提出的是绝对可行的选项。另一种解决方案是简单地将quiz_question_choice_id存储在quiz_attempt_answers上,并在quiz_question_choices上添加一个活动标志,标志着从某个问题中删除时选择处于非活动状态 - 它在操作测验时会增加一些开销,但它会使您的关联保持完整。然后,在显示测验时,您只需从答案选项列表中筛选出非活动选项。我建议这样做的主要原因是为了提供有凝聚力的数据,所以如果从现在开始企业要求出现,想要知道统计信息,例如“有多少人用选择X回答这个问题?”,您将拥有所需的一切编写这样的报告。