Question

Disons que j'ai une table Student, elle a un identifiant int.J'ai un ensemble fixe de 10 questions à choix multiples avec 5 réponses possibles.J'ai un tableau de réponses normalisé qui contient l'identifiant de la question, le Student.answer (1-5) et le Student.ID

J'essaie d'écrire une seule requête qui renverra tous les scores supérieurs à un certain pourcentage.À cette fin, j'ai écrit un simple UDF qui accepte les Student.answers et la bonne réponse, il a donc 20 paramètres.

Je commence à me demander s'il vaut mieux dénormaliser le tableau de réponses, l'intégrer dans mon application et laisser mon application faire la notation.

Quelqu'un a-t-il déjà abordé quelque chose comme ça et a-t-il une idée ?

Était-ce utile?

La solution

Si je comprends bien votre schéma et votre question, que diriez-vous de 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 à vos besoins.

Autres conseils

Je laisserais probablement à votre application le soin d'effectuer la notation.Vérifier Peut-être que la normalisation n'est pas normale par Jeff Atwood.

L'architecture dont vous parlez pourrait devenir très lourde à long terme, et si vous devez modifier les questions, cela signifie davantage de modifications dans l'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 également entraîner un manque de flexibilité, ou du moins des dépenses supplémentaires pour la mise à jour, à terme.

Pas question, vous voulez absolument que cela reste normal.Ce n’est même pas une question si difficile.

Fondamentalement, vous voulez joindre les réponses correctes des élèves avec le total des réponses à cette question et faire un décompte.Cela vous donnera le pourcentage correct.Faites cela pour chaque élève et inscrivez le pourcentage minimum correct dans une clause Where.

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 tout à fait possible.Je me demande pourquoi vous avez besoin de 20 paramètres pour cette fonction ?

Une solution relationnelle basée sur des ensembles sera plus simple et plus rapide dans la plupart des cas.

Cette requête devrait être assez simple...en supposant que vous avez la bonne réponse stockée dans le tableau des questions.Vous avez la bonne réponse stockée dans le tableau des questions, n'est-ce pas ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top