Лучшая практика для структуры голосования по комментариям - PullRequest
7 голосов
/ 01 мая 2009

Я работаю над приложением PHP, в котором есть несколько объектов, которые можно комментировать. За каждый комментарий можно голосовать, причем пользователи могут дать ему +1 или -1 (например, Digg или Reddit). Прямо сейчас я планирую иметь таблицу голосований с идентификатором user_id и информацией об их голосовании, которая, кажется, работает нормально.

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

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

Для большей ясности по поводу текущей структуры базы данных:

Таблица комментариев:

  • user_id
  • object_id
  • total_votes

Таблица голосов:

  • comment_id
  • user_id
  • голос

Конечная цель:

  • Разрешить пользователю голосовать только один раз за каждый комментарий с наименьшим количеством запросов MySQL (каждый объект имеет несколько комментариев)

Ответы [ 3 ]

9 голосов
/ 01 мая 2009

Чтобы убедиться, что каждый голосующий голосует только один раз, создайте таблицу голосов с помощью этих полей - CommentID, UserID, VoteValue Сделайте CommentID и UserID первичным ключом, который гарантирует, что один пользователь получит только один голос. Затем, чтобы запросить голоса для комментария, сделайте что-то вроде этого:

SELECT SUM(VoteValue)
FROM Votes
WHERE CommentID = ?

Это помогает?

0 голосов
/ 01 мая 2009

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

Что касается структуры базы данных, разделение этих вещей кажется совершенно логичным. голосования {user_id, object_id, object_type, voice_info ...)

Возможно, вы уже делаете это, извините, но я не смогу интерпретировать ваш пост, если бы это было так.

0 голосов
/ 01 мая 2009

Почему бы вам не сохранить итоговые голоса за каждый комментарий? Увеличивайте / уменьшайте это, когда новый голос произошел.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...