我的网络应用处理民意调查(调查)。现在我有2个表作为数据库模式的一部分。
polls
id
question
choices (ex: yes,no,maybe)
created
polls_responses
poll_id
user_id
tracker_id
response
问题在于,在一些民意调查中,我有很多回应(> 1000)。人们可以查看民意调查的结果,它将显示有多少用户投票赞成,是,或者可能以及有多少匿名用户投票赞成,不赞成或者也许。这样做的问题是,每当用户查看轮询结果时,它必须遍历所有响应并计算响应总数,每个选择的响应数,用户做出的每个选择的响应数,以及tracker_id(匿名用户)对每个选项做出的响应数,并计算百分比并将其显示在条形图中。这使得页面加载速度非常慢。我正在考虑对数据库进行非规范化以提高性能,以便我们有类似的东西
polls
id
question
choices (ex: yes,no,maybe)
total_responses (ex: 10,3,3,4)
user_responses (ex: 5,2,2,1)
anon_responses (ex: 5,1,3,1)
created
polls_responses
poll_id
user_id
tracker_id
response
也就是说,对于total_responses
中的值,10是总数,3是选择yes
的响应数,3是选择no
的响应数,和4是选择maybe
的响应数。相同的格式适用于user_responses
和anon_responses
字段。如果我能对这种方法有所了解,我们将不胜感激!谢谢你的时间。
答案 0 :(得分:3)
首先,我认为你不需要循环计算它。
看看这样的事情
SELECT poll_id,
COUNT(response) Total,
SUM(CASE WHEN response = 'Y' THEN 1 ELSE 0 END) TotalYes,
SUM(CASE WHEN response = 'N' THEN 1 ELSE 0 END) TotalNo,
SUM(CASE WHEN response = 'M' THEN 1 ELSE 0 END) TotalMaybe,
SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) UserYes,
SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) UserNo,
SUM(CASE WHEN [user_id] IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) UserMaybe,
SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'Y' THEN 1 ELSE 0 END) TrackerYes,
SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'N' THEN 1 ELSE 0 END) TrackerNo,
SUM(CASE WHEN tracker_id IS NOT NULL AND response = 'M' THEN 1 ELSE 0 END) TrackerMaybe
FROM polls_responses
GROUP BY poll_id
这应该可以获得每个poll_id的相应结果,然后您可以从中返回到表中以检索投票详细信息。
答案 1 :(得分:0)
不要害怕使用数据库为您做一些繁重的工作。您不必遍历输出中的所有响应。
您尚未指定数据库平台,但您可以使用某些连接和聚合函数或某些子选择在数据库中处理此问题。