0

假设我有一个学生表,它有一个 int ID。我有一组固定的 10 个多项选择题,有 5 个可能的答案。我有一个标准化的答案表,其中包含问题 ID、Student.answer (1-5) 和 Student.ID

我正在尝试编写一个查询,该查询将返回超过某个百分比的所有分数。为此,我编写了一个简单的 UDF,它接受 Student.answers 和正确答案,因此它有 20 个参数。

我开始怀疑是否最好对答案表进行非规范化,将其带入我的应用程序并让我的应用程序进行评分。

任何人都曾经处理过这样的事情并有洞察力吗?

4

6 回答 6

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 子句。

于 2008-08-22T14:11:58.577 回答
1

我可能会把它留给你的应用程序来执行评分。看看杰夫·阿特伍德的也许规范化不是正常的。

于 2008-08-22T13:58:59.167 回答
0

从长远来看,您正在谈论的架构可能会变得非常麻烦,如果您需要更改问题,则意味着对您正在使用的 UDF 进行更多更改。

我认为您可能可以在代码中进行分析,而不必对数据库进行非规范化。去规范化也可能导致不灵活,或者至少增加了更新的费用。

于 2008-08-22T14:00:51.753 回答
0

没办法,你肯定想让它正常化。这甚至不是那么难的查询。

基本上,您希望将学生的正确答案与该问题的总答案一起加入,并进行计数。这会给你正确的百分比。对每个学生都这样做,并将正确的最低百分比放在 where 子句中。

于 2008-08-22T14:01:58.427 回答
0

非规范化通常被认为是最后的手段。这个问题似乎与非常常见的调查应用程序非常相似。没有看到你的数据模型,很难提出解决方案,但我会说这绝对是可能的。我想知道为什么该函数需要 20 个参数?

在大多数情况下,基于关系集的解决方案会更简单、更快。

于 2008-08-22T14:02:13.683 回答
0

这个查询应该很容易......假设您的问题表中存储了正确的答案。您确实在问题表中存储了正确答案,对吗?

于 2008-08-22T14:28:35.353 回答