数据库设计问题(RAILS)

时间:2011-03-17 20:22:59

标签: ruby-on-rails database-design

我有一个测验应用程序。这遵循正常的数据库开发模式

测验 - > QuizQuestions - > QuizQuestionChoices

QuizAttempt - > QuizAttemptAnswer

在quiz_attempt_answers中,我将答案存储为字符串而不是对QuizQuestionChoices的引用,原因如下。

  1. 如果问题从测验中删除(也许测验会被修改),我们不想丢失他们投入的内容。
  2. 如果选择被更改或重新排列,我们希望得到他们选择的答案
  3. 这些有效的原因是不使用外键作为答案吗?

2 个答案:

答案 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回答了这个问题?”,那么你将获得所需的一切写这样的报道。