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 は Choice の応答数、yes3 は Choice の応答数no、4 は Choice の応答数ですmaybeuser_responsesフィールドとフィールドにも同じフォーマットが適用されanon_responsesます。この方法について意見をいただければ幸いです。御時間ありがとうございます。

編集:MySQLを使用しています

4

2 に答える 2

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 ごとにそれぞれの結果が取得され、そこからテーブルに戻ってポーリングの詳細を取得できます。

于 2010-02-19T06:58:09.410 に答える
0

データベースを使用して面倒な作業を行うことを恐れないでください。出力内のすべての応答をループする必要はありません。

データベース プラットフォームを指定していませんが、おそらく、いくつかの結合関数と集計関数、またはいくつかのサブ選択を使用して、データベースでこれを処理できます。

于 2010-02-19T06:56:50.027 に答える