2008-08-22 13 views
0

私は学生テーブルを持っていますが、それはint IDを持っています。私は5つの可能な答えで10の多項選択問題の固定セットを持っています。私は質問ID、Student.answer(1-5)とStudent.IDを持つ正規化された回答テーブルを持っていますSQLクエリのヘルプ - 複数の選択テストの採点

私は特定のpecentage上のすべてのスコアを返す単一のクエリを作成しようとしています。この目的のために、私はStudent.answersと正しい答えを受け入れる簡単なUDFを書いたので、20のパラメータがあります。

Answerテーブルを非正規化して、それを私のapplcationに持ってきて、私のアプリケーションにスコアリングをさせるのが良いかどうか疑問に思っています。

これまで誰もがこのようなことに取り組み、洞察力を持っていますか?

答えて

2

私はどのようにこのようなものについては、正しくごスキーマと質問を理解していれば:たとえば、7以上のスコアを持つ学生を選択する必要があります

select student_name, score 
from students 
    join (select student_answers.student_id, count(*) as score 
     from student_answers, answer_key 
     group by student_id 
     where student_answers.question_id = answer_key.question_id 
      and student_answers.answer = answer_key.answer) 
    as student_scores on students.student_id = student_scores.student_id 
where score >= 7 
order by score, student_name 

。目的のためにwhere句を調整するだけです。

1

スコアリングを実行するには、アプリケーションに任せておきます。 Jeff AtwoodのMaybe Normalizing Isn't Normalをチェックしてください。

0

あなたが話しているアーキテクチャは、長期的には非常に面倒になる可能性があります。質問を変更する必要がある場合は、使用しているUDFの変更が増えます。

私はおそらくデータベース内の正規化を解除することなく、コード内で分析を行うことができると思います。正規化を解除することで、柔軟性が失われたり、少なくとも更新のための費用が追加されたりする可能性があります。

0

あなたは間違いなくそれを正規化したままにしておきたいと思います。それはクエリの難しいことでもありません。

基本的には、生徒は正しい答えをその質問のトータル解答に加えてカウントしたいと考えています。これはあなたに正しいパーセントを与えるでしょう。各生徒にそれを行い、where句に正しい最低パーセントを書いてください。

1

一般に、非正規化は最後の手段と考えられます。この問題は、調査アプリケーションと非常によく似ています。これは非常に一般的です。データモデルを見ることなく、ソリューションを提案するのは難しいですが、間違いなく可能です。私はその機能に20のパラメータが必要なのはなぜだろうか?

リレーショナルセットベースのソリューションは、ほとんどの場合、より簡単で高速になります。

0

このクエリは、質問テーブルに正しい答えが格納されていると仮定すると、非常に簡単になるはずです。質問表に正しい答えが記憶されていますか?