Структура базы данных для системы голосования c голосованием вверх и вниз
Я собираюсь создать систему голосования для веб-приложения и задаюсь вопросом, Какой лучший способ будет хранить голоса в базе данных (SQL).
система голосования аналогична системе StackOverflow. Я сейчас размышляю, следует ли мне хранить голоса вверх и вниз в разных таблицах. Таким образом, легче подсчитать все голоса resp. понижение голосов. С другой стороны, мне нужно запросить две таблицы, чтобы найти все голоса для пользователя или проголосовавшего элемента.
в качестве альтернативы быть одной таблицей с логическим полем, указывающим, является ли это голосование голосованием вверх или вниз. Но я думаю, что подсчет голосов вверх или вниз довольно медленный (когда у вас много голосов), а индекс на логическом поле (насколько я знаю) не имеет большого смысла.
Как бы вы создали структуру базы данных? Один или два столика?
4 ответов
Что касается комментариев, мы нашли решение, которое лучше всего подходит для Зардоз
Он не хочет всегда подсчитывать голоса и нуждается в как можно больше деталей. Таким образом, решение-это смесь обоих.
- добавление целочисленного поля в рассматриваемую таблицу для хранения подсчетов голосов (убедитесь, что не будет переполнений).
- создать дополнительные таблицы для записи голоса (пользователя, сообщение, дата, вверх/вниз и т. д.)
Я бы рекомендовал используйте триггеры для автоматического обновления "поля подсчета голосов"при вставке/удалении / обновлении голосования в таблице журнала.
Если ваши голоса просто вверх/вниз, то вы могли бы сделать votes
таблица, связанная с сообщениями и имеющая стоимостью 1 или -1 (вверх / вниз). Таким образом, вы можете sum
за один раз.
вам понадобится таблица ссылок между пользователями и объектами, за которые голосуют, я бы подумал. Это позволит вам увидеть, какие пользователи уже проголосовали и предотвратить их от подачи новых голосов. Таблица может записывать в логическое значение, является ли это голосованием вверх или вниз.
Я бы посоветовал хранить в проголосовавшей сущности текущее поле подсчета голосов, чтобы облегчить запрос. Экономия в размере будет незначительной, если вы опустите это.