Система голосования - Как сохранить все голоса в MySQL и как правильно подсчитать результаты - PullRequest
2 голосов
/ 13 июня 2009

Я разрабатываю систему, позволяющую пользователям голосовать по различным предметам, используя набор вопросов Да / Нет / Возможно.

Каждый вопрос будет взвешен как 2 (Да) / 0 (Нет) / 1 (Возможно) ПРИМЕЧАНИЕ (Пользователи будут голосовать несколько раз, потенциально огромные суммы)

Мой план - хранить ответы в базе данных mysql.

  1. Хранить ли каждый голос отдельно? (ID / Голосование /)

  2. Что такое правильный запрос для подсчета результатов голосования?

  3. Какой самый эффективный способ хранения и получения результатов? Должен ли я иметь таблицу, в которой хранятся результаты голосования?

Ответы [ 4 ]

3 голосов
/ 13 июня 2009

Основная причина, по которой вам нужно сделать № 1, состоит в том, чтобы не допустить дублирования голосов (например, хранить IP-адрес, на котором каждый голос был отдан с этой записью).

если вы ищете отличную производительность, вы можете делать то, что digg.com (согласно лекции) делает для некоторых вещей такого рода. они хранят все голоса в memcached узле с IP, чтобы предотвратить дублирование с истечением ~ 24 часов. Затем они получают задание daemon / cron, подсчитывают голоса и сохраняют их в агрегированном формате на уровне persistent / db.

1 голос
/ 13 июня 2009

Я бы не стал хранить взвешенные значения в БД, вместо этого я бы использовал БД в качестве системы подсчета для 3 различных типов голосов. Вы можете иметь 1 таблицу с 3 полями в ней

Поля: Да, Нет, Может быть, все целые числа. Изначально начинайте значения полей с 0. Каждый раз, когда приходит голос, увеличивайте значение соответствующего поля.

После, сделайте взвешенную математику в вашем коде. Так же просто, как умножение числа, скажите в поле «да» на 2, чтобы получить взвешенный результат, например.

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

Чтобы обеспечить уникальность, я бы сначала сделал так, чтобы пользователь зарегистрировался, чтобы вы могли пометить пользователя как уже проголосовавшего за этот конкретный опрос, чтобы он не мог голосовать снова. Они всегда могут зарегистрироваться снова, хотя. К сожалению, это сложно обойти, так как они могут просто использовать другой компьютер, прокси-сервер, или у многих людей есть динамические IP-адреса, которые просто потребуют перезагрузки модема для повторного голосования, даже если вы хранили IP-адреса, чтобы ограничить такие ситуации.

1 голос
/ 13 июня 2009

Следует учесть одну вещь: хранение каждого голоса отдельно упрощает ограничение голосования по IP.

0 голосов
/ 13 июня 2009

Я думаю, вам нужно будет хранить каждый отдельный голос только для целей аудита или регистрации.

Полагаю, вы могли бы сделать все это в одном ряду, за вопрос.

так:

Voteid Questionid VoteTally

И тогда вы можете просто запустить обновление по голосованию. когда да, добавьте 2, когда возможно, добавьте 1, когда нет, ничего не делайте.

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

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