2015-04-23 2 views
0

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

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

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

+0

Проверить в базе данных, если пользователь уже проголосовал этот пост. – Daan

+0

Ну, это то, что я планировал, но как бы я мог хранить, если пользователь уже проголосовал за сообщение (вот в чем вопрос) –

+0

Определенный пользователь - даже один проверенный по электронной почте - может проголосовать несколько раз, если захочет. Вам может потребоваться SMS-проверка, которая сложнее (но не невозможно) обойти, но вы можете отпугнуть реальных пользователей, которые не доверяют вам своим номером телефона. – halfer

ответ

0

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

+0

Отмена нисходящего хода потребует, чтобы запись была удалена, но, по-видимому, для другой записи (реального нисходящего) потребуется запись. – halfer

+0

Это намного больше смысла, я дам ему шанс. Благодаря! –

+0

@halfer Да, я просто проверю, проголосовал ли пользователь за сообщение и удалил ли запись голоса, если они это сделают? –

0

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

ГОЛОСУЕМ История (Вариант 1)

  • voter_id
  • POST_ID
  • действие (upvote/downvote)
  • created_at

История ГОЛОСУЕМ (Вариант 2)

  • voter_id
  • POST_ID
  • точек (это поле может получить отрицательные числа для downvote)
  • created_at

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

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

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

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

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

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

0

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

Визуально: enter image description here

Смежные вопросы