我有一个测验应用程序。这遵循正常的数据库开发模式
测验 - > QuizQuestions - > QuizQuestionChoices
QuizAttempt - > QuizAttemptAnswer
在quiz_attempt_answers中,我将答案存储为字符串而不是对QuizQuestionChoices的引用,原因如下。
这些有效的原因是不使用外键作为答案吗?
答案 0 :(得分: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,你仍然有他们的实际答案。
有些情况下,您甚至可以将原始问题与答案一起存储。如果有人改变了无意中改变其含义的措辞。
答案 1 :(得分:0)
回答你的上一个问题,他们并不是特别有效的理由,只是因为有很多好的选择。当然,它总是取决于您的情况,您计划将来如何使用数据,实施替代方案的简单程度等等......
lebreeze所建议的绝对是一个可行的选择。另一种解决方案是简单地将quiz_question_choice_id存储在quiz_attempt_answers上,并在quiz_question_choices上添加一个活动标记,当标记从问题中删除时,该标记选择处于非活动状态 - 在操作测验时会增加一些开销,但它会保持您的关联。然后,在显示测验时,您只需从答案选项列表中过滤掉非活动选项。我建议这一点的主要原因是为了有凝聚力的数据,所以如果从现在起一年后出现了想要了解统计数据的统计数据,例如“有多少人用选择X回答了这个问题?”,那么你将获得所需的一切写这样的报道。