Нужен совет по денормализации базы данных, которая касается ответов на опросы - PullRequest
4 голосов
/ 19 февраля 2010

Мое веб-приложение занимается опросами (опросами). Сейчас у меня есть 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. Если бы я мог получить некоторые мнения по этому методу, я был бы очень признателен! Спасибо за ваше время.

РЕДАКТИРОВАТЬ: я использую MySQL

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

Во-первых, я не думаю, что вам нужно зацикливаться, чтобы посчитать это.

Посмотрите на что-то вроде этого

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 голосов
/ 19 февраля 2010

Не бойтесь использовать базу данных, чтобы сделать тяжелую работу за вас.Вам не нужно перебирать все ответы в выходных данных.

Вы не указали платформу базы данных, но, возможно, вы могли бы обработать это в базе данных, используя некоторые объединения и агрегатные функции, или некоторые вспомогательные функции.выбирает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...