Система голосования в стиле Reddit, как мне избежать дублирования голосов?

У меня есть таблица, в которой хранится сообщение. Каждый пост имеет идентификатор, заголовок, содержание и оценку. В настоящее время вам может понравиться сообщение, и его оценка будет увеличиваться и уменьшаться, если вам не нравится.

Теперь вещь, которую я не понимаю: как мне избежать того, что пользователь будет голосовать более одного раза? Конечно, они могут просто обновить и проголосовать снова. Я читал некоторые статьи, в которых хранятся файлы cookie и т. Д., Но вы не можете просто отключить файлы cookie или очистить их и проголосовать снова?

Я думал, что вам нужно будет хранить информацию о том, кто проголосовал, или, скорее, удостоверение личности, кто проголосовал тоже. Тем не менее, я не могу представить, как бы я поступил по этому поводу? Буду ли я хранить идентификатор избирателя в сообщении, за которое он голосует, или что-то еще?

0

Решение

Вам понадобится дополнительная таблица posts_vote или что-то. Положите в него поля user_id и post_id. Если пользователь проголосовал за публикацию, вы вставляете оба идентификатора в эту таблицу. Если пользователь отказывается, найдите запись и удалите ее.

0

Другие решения

Вы можете хранить записи голосования в отдельной таблице.

История голосования (Альтернатива 1)

  • voter_id
  • post_id
  • действие (upvote / downvote)
  • создан в

История голосования (Альтернатива 2)

  • voter_id
  • post_id
  • баллы (это поле может получить отрицательные числа для downvote)
  • создан в

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

В будущем таблица истории голосования будет расти и будет вызывать проблемы с производительностью, вы можете синхронизировать записи истории с помощью redis / memcached / etc. и делать ваши проверки быстрее с этими технологиями хранения.

Кроме того, использование файлов cookie может помочь вам отключить голосование, не обращаясь к серверу, и уменьшит количество запросов к вашему веб-серверу.
Вы можете хранить идентификаторы проголосовавших постов в куки и проверять их с помощью javascript, не делайте запрос, если пользователь уже проголосовал за пост.

Таким образом, вы можете иметь два слоя для проверки, проголосовал ли пользователь.

  1. Печенье и JavaScript
  2. Постоянные данные на стороне сервера

Если номер один терпит неудачу (пользователи могут обойти это путем изменения браузера или очистки файлов cookie), он возвращается к номеру два, и вы не разрешаете голосовать на стороне сервера.

0

Просто в качестве примера:
Допустим, у вас есть таблицы posts а также votes, Тогда вы могли бы иметь posts_votes в качестве справочной таблицы.

Визуально:
введите описание изображения здесь

0
По вопросам рекламы [email protected]