假设我有一张Student表,它有一个int ID。我有一组固定的10个选择题,有5个可能的答案。我有一个标准化的答案表,其中包含问题ID,Student.answer(1-5)和Student.ID
我正在尝试编写单个查询,该查询将返回超过某个百分比的所有分数。为此我编写了一个简单的UDF,接受Student.answers和正确的答案,因此它有20个参数。
我开始怀疑是否最好将答案表反规范化,将其纳入我的应用程序并让我的应用程序进行评分。
任何人都应该解决这样的事情并有洞察力吗?
答案 0 :(得分: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 :(得分:1)
我可能会将其留给您的应用程序来执行评分。查看Jeff Atwood的Maybe Normalizing Isn't Normal。
答案 2 :(得分:0)
从长远来看,您所谈论的架构可能变得非常繁琐,如果您需要更改问题,则意味着您正在使用的UDF会发生更多变化。
我认为您可以在代码中进行分析,而不必对数据库进行反规范化。非正常化也可能导致不灵活,或者至少增加更新费用。
答案 3 :(得分:0)
没办法,你肯定希望保持标准化。它甚至不是那么难以进行查询。
基本上,您希望将学生的正确答案与该问题的总答案相加,并进行计数。这将为您提供正确的百分比。为每个学生执行此操作,并将最小百分比正确放在where子句中。
答案 4 :(得分:0)
非规范化通常被认为是最后的手段。问题似乎与调查应用程序非常相似,这些应用程序很常见。如果没有看到您的数据模型,很难提出解决方案,但我会说这绝对是可能的。我想知道你为什么需要20个参数来完成这个功能?
在大多数情况下,基于关系集的解决方案会更简单,更快捷。
答案 5 :(得分:0)
此查询应该非常简单...假设您在问题表中存储了正确的答案。您确实在问题表中存储了正确的答案,对吗?