2008-08-22 5 views
0

Скажем, у меня есть таблица Student, у нее есть идентификатор int. У меня есть фиксированный набор из 10 вопросов с несколькими вариантами ответов с 5 возможными ответами. У меня есть нормализованная таблица ответов, в которой есть идентификатор вопроса, Student.answer (1-5) и Student.IDSQL Query Help - Оценка нескольких тестов выбора

Я пытаюсь написать один запрос, который вернет все оценки за определенный фрагмент. С этой целью я написал простой UDF, который принимает Student.answers и правильный ответ, поэтому он имеет 20 параметров.

Я начинаю задаваться вопросом, лучше ли денормализовать стол ответов, привести его в мой ассемблер и позволить моему приложению делать подсчет очков.

Кто-нибудь когда-либо занимается чем-то подобным и понимает?

ответ

2

Если я правильно понимаю вашу схему и вопрос правильно, как о чем-то вроде этого:

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 для своих целей.

1

Я бы, вероятно, оставил его в своем приложении для выполнения оценки. Отъезд Maybe Normalizing Isn't Normal от Джеффа Этвуда.

0

Архитектура, о которой вы говорите, может стать очень громоздкой в ​​долгосрочной перспективе, и если вам нужно изменить вопросы, это означает больше изменений в используемом вами UDF.

Я бы подумал, что вы, вероятно, можете сделать свой анализ в коде, не обязательно де-нормализуя свою базу данных. Де-нормализация также может придать гибкость или, по крайней мере, дополнительные расходы для обновления по дороге.

0

Ни в коем случае, вы определенно хотите сохранить нормализацию. Это даже не тот вопрос.

В принципе, вы хотите, чтобы левые присоединились к ученикам правильных ответов с полными ответами на этот вопрос и делали подсчет. Это даст вам процент правильных значений. Сделайте это для каждого ученика и поставьте минимальный процент правильно в предложении where.

1

Денормализация обычно считается последней инстанцией. Проблема кажется очень похожей на приложения для съемки, которые очень распространены. Не видя вашей модели данных, сложно предложить решение, но я скажу, что это определенно возможно. Мне интересно, зачем вам 20 параметров этой функции?

Реляционное решение на основе набора будет проще и быстрее в большинстве случаев.

0

Этот запрос должен быть довольно простым ... если у вас есть правильный ответ, сохраненный в таблице вопросов. У вас есть правильный ответ, хранящийся в таблице вопросов, правильно?