У меня есть таблица, в которой хранится сообщение. Каждый пост имеет идентификатор, заголовок, содержание и оценку. В настоящее время вам может понравиться сообщение, и его оценка будет увеличиваться и уменьшаться, если вам не нравится.
Теперь вещь, которую я не понимаю: как мне избежать того, что пользователь будет голосовать более одного раза? Конечно, они могут просто обновить и проголосовать снова. Я читал некоторые статьи, в которых хранятся файлы cookie и т. Д., Но вы не можете просто отключить файлы cookie или очистить их и проголосовать снова?
Я думал, что вам нужно будет хранить информацию о том, кто проголосовал, или, скорее, удостоверение личности, кто проголосовал тоже. Тем не менее, я не могу представить, как бы я поступил по этому поводу? Буду ли я хранить идентификатор избирателя в сообщении, за которое он голосует, или что-то еще?
Вам понадобится дополнительная таблица posts_vote
или что-то. Положите в него поля user_id и post_id. Если пользователь проголосовал за публикацию, вы вставляете оба идентификатора в эту таблицу. Если пользователь отказывается, найдите запись и удалите ее.
Вы можете хранить записи голосования в отдельной таблице.
История голосования (Альтернатива 1)
История голосования (Альтернатива 2)
Поэтому, когда у вас есть эта конкретная запись, вы можете проверить, голосовал ли пользователь за публикацию ранее, и принять решение об увеличении / уменьшении точек в фактической таблице записей.
В будущем таблица истории голосования будет расти и будет вызывать проблемы с производительностью, вы можете синхронизировать записи истории с помощью redis / memcached / etc. и делать ваши проверки быстрее с этими технологиями хранения.
Кроме того, использование файлов cookie может помочь вам отключить голосование, не обращаясь к серверу, и уменьшит количество запросов к вашему веб-серверу.
Вы можете хранить идентификаторы проголосовавших постов в куки и проверять их с помощью javascript, не делайте запрос, если пользователь уже проголосовал за пост.
Таким образом, вы можете иметь два слоя для проверки, проголосовал ли пользователь.
Если номер один терпит неудачу (пользователи могут обойти это путем изменения браузера или очистки файлов cookie), он возвращается к номеру два, и вы не разрешаете голосовать на стороне сервера.
Просто в качестве примера:
Допустим, у вас есть таблицы posts
а также votes
, Тогда вы могли бы иметь posts_votes
в качестве справочной таблицы.
Визуально: