Структура базы данных для системы голосования c голосованием вверх и вниз

Я собираюсь создать систему голосования для веб-приложения и задаюсь вопросом, Какой лучший способ будет хранить голоса в базе данных (SQL).

система голосования аналогична системе StackOverflow. Я сейчас размышляю, следует ли мне хранить голоса вверх и вниз в разных таблицах. Таким образом, легче подсчитать все голоса resp. понижение голосов. С другой стороны, мне нужно запросить две таблицы, чтобы найти все голоса для пользователя или проголосовавшего элемента.

в качестве альтернативы быть одной таблицей с логическим полем, указывающим, является ли это голосование голосованием вверх или вниз. Но я думаю, что подсчет голосов вверх или вниз довольно медленный (когда у вас много голосов), а индекс на логическом поле (насколько я знаю) не имеет большого смысла.

Как бы вы создали структуру базы данных? Один или два столика?

4 ответов


Что касается комментариев, мы нашли решение, которое лучше всего подходит для Зардоз

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

  1. добавление целочисленного поля в рассматриваемую таблицу для хранения подсчетов голосов (убедитесь, что не будет переполнений).
  2. создать дополнительные таблицы для записи голоса (пользователя, сообщение, дата, вверх/вниз и т. д.)

Я бы рекомендовал используйте триггеры для автоматического обновления "поля подсчета голосов"при вставке/удалении / обновлении голосования в таблице журнала.


Если ваши голоса просто вверх/вниз, то вы могли бы сделать votes таблица, связанная с сообщениями и имеющая стоимостью 1 или -1 (вверх / вниз). Таким образом, вы можете sum за один раз.



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

Я бы посоветовал хранить в проголосовавшей сущности текущее поле подсчета голосов, чтобы облегчить запрос. Экономия в размере будет незначительной, если вы опустите это.