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

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

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

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

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

Ответы

Ответ 1

Что касается комментариев, мы нашли решение, которое наилучшим образом соответствует Zardoz

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

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

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

Ответ 2

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

Ответ 4

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

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