2010-02-19 39 views
4

我的web应用程序处理民意调查(调查)。现在我有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_responsesanon_responses字段。如果我能就这种方法得到一些意见,将不胜感激!谢谢你的时间。

编辑:我使用的是MySQL

回答

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,从那里你可以再加入回表检索调查细节。

0

不要害怕使用数据库做一些繁重的为您服务。您不必遍历输出中的所有响应。

您尚未指定数据库平台,但可以使用一些连接和聚合函数或某些子选择在数据库中处理此操作。

相关问题