Pergunta

Digamos que eu tenha uma tabela Student, ela possui um ID interno.Tenho um conjunto fixo de 10 questões de múltipla escolha com 5 respostas possíveis.Eu tenho uma tabela de respostas normalizada que possui o ID da pergunta, o Student.answer (1-5) e o Student.ID

Estou tentando escrever uma única consulta que retornará todas as pontuações acima de uma determinada porcentagem.Para isso escrevi uma UDF simples que aceita Student.answers e a resposta correta, portanto possui 20 parâmetros.

Estou começando a me perguntar se é melhor desnormalizar a tabela de respostas, trazê-la para minha aplicação e deixar minha aplicação fazer a pontuação.

Alguém já enfrentou algo assim e teve uma visão?

Foi útil?

Solução

Se entendi seu esquema e pergunta corretamente, que tal algo assim:

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

Isso deve selecionar os alunos com nota 7 ou mais, por exemplo.Basta ajustar a cláusula where para seus propósitos.

Outras dicas

Eu provavelmente deixaria a sua aplicação realizar a pontuação.Confira Talvez normalizar não seja normal por Jeff Atwood.

A arquitetura da qual você está falando pode se tornar muito complicada no longo prazo, e se você precisar alterar as perguntas, isso significará mais alterações na UDF que você está usando.

Eu acho que você provavelmente poderia fazer sua análise em código sem necessariamente desnormalizar seu banco de dados.A desnormalização também poderia levar à inflexibilidade, ou pelo menos a despesas adicionais para atualização, no futuro.

De jeito nenhum, você definitivamente deseja mantê-lo normalizado.Não é nem uma pergunta tão difícil.

Basicamente, você deseja juntar as respostas corretas dos alunos com o total de respostas para aquela pergunta e fazer uma contagem.Isso lhe dará a porcentagem correta.Faça isso para cada aluno e coloque a porcentagem mínima correta em uma cláusula where.

A desnormalização é geralmente considerada o último recurso.O problema parece muito semelhante aos aplicativos de pesquisa, que são muito comuns.Sem ver o seu modelo de dados fica difícil propor uma solução, mas direi que é definitivamente possível.Estou me perguntando por que você precisa de 20 parâmetros para essa função?

Uma solução baseada em conjuntos relacionais será mais simples e rápida na maioria dos casos.

Esta consulta deve ser bem fácil ...supondo que você tenha a resposta correta armazenada na tabela de perguntas.Você tem a resposta correta armazenada na tabela de perguntas, certo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top