Pregunta

Digamos que tengo una tabla de Estudiantes, tiene un ID int.Tengo un conjunto fijo de 10 preguntas de opción múltiple con 5 respuestas posibles.Tengo una tabla de respuestas normalizada que tiene el ID de la pregunta, Student.answer (1-5) y Student.ID.

Estoy intentando escribir una consulta única que devuelva todas las puntuaciones superiores a un porcentaje determinado.Para ello escribí una UDF simple que acepta las respuestas de los estudiantes y la respuesta correcta, por lo que tiene 20 parámetros.

Estoy empezando a preguntarme si es mejor desnormalizar la tabla de respuestas, incorporarla a mi aplicación y dejar que mi aplicación haga la puntuación.

¿Alguien ha abordado alguna vez algo como esto y tiene una idea?

¿Fue útil?

Solución

Si entiendo su esquema y pregunta correctamente, ¿qué tal algo como esto?

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

Eso debería seleccionar a los estudiantes con una puntuación de 7 o más, por ejemplo.Simplemente ajuste la cláusula Where para sus propósitos.

Otros consejos

Probablemente dejaría que su aplicación realice la puntuación.Verificar Quizás normalizar no sea normal por Jeff Atwood.

La arquitectura de la que habla podría volverse muy engorrosa a largo plazo y, si necesita cambiar las preguntas, significa más cambios en la UDF que está utilizando.

Creo que probablemente podría hacer su análisis en código sin necesariamente desnormalizar su base de datos.La desnormalización también podría generar inflexibilidad, o al menos un gasto adicional para actualizar, en el futuro.

De ninguna manera, definitivamente querrás mantenerlo normalizado.Ni siquiera es una consulta tan difícil.

Básicamente, desea unir a la izquierda las respuestas correctas de los estudiantes con el total de respuestas para esa pregunta y hacer un recuento.Esto le dará el porcentaje correcto.Haga eso para cada estudiante y coloque el porcentaje mínimo correcto en una cláusula donde.

La desnormalización generalmente se considera un último recurso.El problema parece muy similar al de las aplicaciones de encuestas, que son muy comunes.Sin ver su modelo de datos, es difícil proponer una solución, pero diré que definitivamente es posible.Me pregunto por qué necesitas 20 parámetros para esa función.

Una solución basada en conjuntos relacionales será más sencilla y rápida en la mayoría de los casos.

Esta consulta debería ser bastante fácil...suponiendo que tiene la respuesta correcta almacenada en la tabla de preguntas.Tienes la respuesta correcta almacenada en la tabla de preguntas, ¿verdad?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top