2010-02-19 40 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

不要害怕使用數據庫做一些繁重的爲您服務。您不必遍歷輸出中的所有響應。

您尚未指定數據庫平臺,但可以使用一些連接和聚合函數或某些子選擇在數據庫中處理此操作。

相關問題