Структура базы данных для системы голосования с превышением голосов
Я собираюсь создать систему голосования для веб-приложения и задаться вопросом, каким лучшим способом было бы сохранить голоса в базе данных (SQL).
Система голосования аналогична системе StackOverflow. Сейчас я размышляю, если я должен хранить вверх и вниз голоса в разных таблицах. Таким образом, легче подсчитать все голоса или. голосов. С другой стороны, я должен запросить две таблицы, чтобы найти все голоса для пользователя или проголосовавшего элемента.
Альтернативой может быть одна таблица с булевым полем, которая указывает, является ли это голосование голосом вверх или вниз. Но я думаю, что подсчет голосов или голосов вниз довольно медленный (когда у вас много голосов), а индекс в булевом поле (насколько мне известно) не имеет большого смысла.
Как бы вы создали структуру базы данных? Одна или две таблицы?
Ответы
Ответ 1
Что касается комментариев, мы нашли решение, которое наилучшим образом соответствует Zardoz
Он не хочет всегда подсчитывать голоса и потребности как можно больше деталей. Таким образом, решение представляет собой сочетание обоих.
- Добавление целочисленного поля в рассматриваемой таблице для хранения подсчетов голосов (убедитесь, что переполнений не будет).
- Создайте дополнительные таблицы для регистрации голосов (пользователя, сообщения, даты, вверх/вниз и т.д.).
Я бы рекомендовал использовать триггеры для автоматического обновления поля подсчета голосов при вставке/удалении/обновлении голосования в таблице журналов.
Ответ 2
Если ваши голоса просто вверх/вниз, вы можете сделать таблицу votes
ссылкой на сообщения и иметь значение 1 или -1 (вверх/вниз). Таким образом вы можете sum
за один раз.
Ответ 3
https://meta.stackexchange.com/questions/1863/so-database-schema
Стоит посмотреть или
http://sqlserverpedia.com/wiki/Understanding_the_StackOverflow_Database_Schema
Ответ 4
Вам понадобится таблица ссылок между пользователями и субъектами, на которые проголосовали, подумал я. Это позволит вам видеть, какие пользователи уже голосовали, и не дать им представить дальнейшие голоса. Таблица может записывать в логическом состоянии, является ли это голосованием вверх или вниз.
Я бы посоветовал сохранить в проголосовавшем субъекте текущее поле подсчета голосов, чтобы облегчить запрос. Сохранение размера было бы незначительным, если вы опустили это.