Справка по SQL-запросам — оценка тестов с множественным выбором
-
09-06-2019 - |
Вопрос
Скажем, у меня есть таблица Student, у нее есть int ID.У меня есть фиксированный набор из 10 вопросов с несколькими вариантами ответов и 5 возможными ответами.У меня есть нормализованная таблица ответов с идентификатором вопроса, Student.ответ (1-5) и Student.ID.
Я пытаюсь написать один запрос, который вернет все оценки, превышающие определенный процент.С этой целью я написал простую пользовательскую функцию, которая принимает Student.ответы и правильный ответ, поэтому имеет 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.
Я думаю, вы могли бы провести анализ в коде, не денормализуя базу данных.Денормализация может также привести к негибкости или, по крайней мере, к дополнительным расходам на обновление в будущем.
Ни в коем случае, вы определенно хотите, чтобы это было нормализовано.Это даже не такой уж и сложный вопрос.
По сути, вы хотите объединить правильные ответы учащихся с общим количеством ответов на этот вопрос и провести подсчет.Это даст вам процент правильности.Сделайте это для каждого учащегося и укажите минимальный процент правильных ответов в пункте «где».
Денормализация обычно считается крайней мерой.Проблема очень похожа на приложения для опросов, которые очень распространены.Не видя вашей модели данных сложно предложить решение, но скажу, что оно однозначно возможно.Мне интересно, зачем этой функции нужно 20 параметров?
Решение на основе реляционного набора в большинстве случаев будет проще и быстрее.
Этот запрос должен быть довольно простым...при условии, что у вас есть правильный ответ, сохраненный в таблице вопросов.У вас же есть правильный ответ в таблице вопросов, верно?