2011-11-12 3 views
1

私は選択肢の表に各選択肢を格納し、それらを質問にリンクするか、すべての選択肢と質問テキストを含むオブジェクトを作成し、 1レコード??レール3.1、多肢選択試験、どのように設計するのですか?

私がシリアライズされたオブジェクトメソッドを選択した場合、質問に属する自分自身の何千もの選択肢レコードを保存します。

class Quiz < ActiveRecord::Base 
    has_many :choices 
end 

class Choice < ActiveRecord::Base 
    belongs_to :quiz 
end 

だから、どの方法を検討するのですか?

答えて

2

別表を使用してください。シリアル化されたデータをリレーショナルデータベースに格納することは、ほとんど常に悪い考えです。クリーンな正規化されたスキーマから始めると、将来の変更(そして、すべてのソフトウェアの変更、特に "ワンハングアップ")がより簡単になります。

あなたのケースでは、「質問8のオプション3を選んだ人はいくつですか?」というような質問に簡単に答えることができるように、別のテーブルに選択してください。または "どの質問に2つの選択肢しかない"

テーブルを別にすると、参照整合性がさらに簡単になります。たとえば、answersの数がそれぞれanswer_choicestaken_quizesを設定できます。一貫性のないデータを避けるためanswer_choiceschoicesに戻すことができます。シリアライズされたデータ構造をデータベースに格納する場合、参照整合性は難しく、非常に高価です。

あなたは質問クラスを忘れているようです:クイズには多くの質問があり、各質問には多くの選択肢があります。

+0

ありがとうございました。私のやり方を啓発しました。同じトピックに関する私の他の質問をチェックしてください。http://stackoverflow.com/questions/8102682/rails-3-1-how-to-calculate -answers-number-foreign-key – simo

+0

hello mu、関連付けられたテーブルを質問テーブルにマージすることをお勧めしますか?私は次のような新しいフィールドを持っています:choice1、choice2、choice3、choice4、type string ??これはより良いデザインでしょうか?スピードとパフォーマンスに関して? – simo

+0

@Samir:4つの選択肢しかないと確信しているなら、4つの列が合理的な選択肢です。私はおそらく別のテーブルに行くだろうが、あなたは簡単に外国のキーを返すことができます選択肢に戻って。基本的なルールは、すべてをできる限り正規化し、必要に応じて非正規化することです。パフォーマンスの問題が起きるまではどこにいるのか分かりません。クリーンで正規化されたコードを最適化することは、時期尚早に最適化されたコードをクリーンアップするよりも簡単です。 –

関連する問題