2011-03-17 72 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回答這個問題?」,您將擁有所需的一切編寫這樣的報告。