Структура базы данных для системы голосования с голосами "за" и "против" - PullRequest
17 голосов
/ 10 декабря 2010

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 10 декабря 2010

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

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

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

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

12 голосов
/ 10 декабря 2010

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

2 голосов
/ 10 декабря 2010
0 голосов
/ 10 декабря 2010

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

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

...