2008-08-22 4 views
0

Dites que j'ai une table Étudiant, elle possède un ID int. J'ai un ensemble fixe de 10 questions à choix multiples avec 5 réponses possibles. J'ai une table de réponse normalisée qui a l'id de question, le Student.answer (1-5) et le Student.IDAide sur la requête SQL - Évaluation des tests à choix multiples

J'essaye d'écrire une seule requête qui retournera tous les points sur un certain pecentage. A cette fin, j'ai écrit un UDF simple qui accepte le Student.answers et la bonne réponse, donc il a 20 paramètres.

Je commence à me demander s'il vaut mieux dénormaliser la table de réponses, l'apporter dans mon applcation et laisser mon application faire la notation.

Quelqu'un at-il jamais abordé quelque chose comme ça et avoir un aperçu?

Répondre

2

Si je comprends votre schéma et correctement à la question, que diriez-vous quelque chose comme ceci:

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 

Cela devrait sélectionner les étudiants avec un score de 7 ou plus, par exemple. Ajustez simplement la clause where pour vos besoins.

0

L'architecture dont vous parlez pourrait devenir très lourde à long terme, et si vous avez besoin de changer les questions, cela signifie plus de changements dans le fichier UDF que vous utilisez.

Je pense que vous pourriez probablement faire votre analyse dans le code sans nécessairement dénormaliser votre base de données. La dénormalisation pourrait aussi prêter à l'inflexibilité, ou du moins à la mise à jour, au bout du compte.

0

Pas moyen, vous voulez certainement le garder normalisé. Ce n'est même pas si difficile.

Fondamentalement, vous voulez à gauche rejoindre les réponses correctes des élèves avec le total des réponses à cette question, et faire un compte. Cela vous donnera le pourcentage correct. Faites cela pour chaque étudiant, et mettez le pourcentage minimum correct dans une clause where.

1

La dénormalisation est généralement considérée comme un dernier recours. Le problème semble très similaire aux applications d'enquête, qui sont très courantes. Sans voir votre modèle de données, il est difficile de proposer une solution, mais je dirai que c'est certainement possible. Je me demande pourquoi vous avez besoin de 20 paramètres pour cette fonction?

Une solution basée sur un ensemble relationnel sera plus simple et plus rapide dans la plupart des cas.

0

Cette requête devrait être assez facile ... en supposant que vous avez la bonne réponse stockée dans la table de questions. Vous avez la bonne réponse stockée dans la table des questions, non?