質問

Student テーブルがあるとします。これには int ID があります。5 つの回答が可能な 10 個の多肢選択の質問の固定セットがあります。質問 ID、Student.answer (1-5)、Student.ID を含む正規化された回答テーブルがあります。

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

解答表を非正規化し、それをアプリケーションに取り込み、アプリケーションに採点を行わせる方が良いのではないかと考え始めています。

このようなことに取り組み、洞察力を持った人はいますか?

役に立ちましたか?

解決

あなたのスキーマと質問を正しく理解できた場合、次のようなものはどうでしょうか。

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

たとえば、スコアが 7 以上の生徒が選択されるはずです。目的に合わせて where 句を調整するだけです。

他のヒント

おそらくスコアリングの実行はアプリケーションに任せるでしょう。チェックアウト おそらく正規化は正常ではない ジェフ・アトウッド著。

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

おそらく、データベースを非正規化する必要がなく、コードで分析を行うことができると思います。非正規化により、将来的には柔軟性が低下するか、少なくとも更新費用が追加される可能性があります。

いや、絶対に正常化しておきたいですよね。それほど難しいクエリでもありません。

基本的には、生徒の正解とその質問の合計回答を結合し、カウントしたいと考えます。これにより正解率が得られます。これを各生徒に対して行い、最小正解率を where 句に入力します。

非正規化は一般に最後の手段とみなされます。この問題は、非常に一般的なアンケート アプリケーションに非常に似ているようです。データ モデルを見ずに解決策を提案することは困難ですが、それは間違いなく可能だと言えます。なぜその関数に 20 個のパラメーターが必要なのか疑問に思います。

ほとんどの場合、リレーショナル セット ベースのソリューションの方がシンプルで高速です。

このクエリは非常に簡単なはずです...正しい答えが質問テーブルに保存されていると仮定します。正解は質問テーブルに保存されていますよね?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top