Я создаю блог-подобный веб-сайт, где пользователи могут посещать сообщения других пользователей, и записывается количество просмотров этого сообщения. Я спрашиваю об этом, потому что я не знаю, как я мог бы обрабатывать клики, когда пользователь снова и снова щелкает чье-то сообщение и нечестно увеличивает количество просмотров. Вот варианты, которые я рассмотрел:
1-й вариант
В базе данных MySQL сообщения будут храниться в этой таблице.
Message(massageId, writerId, body, views)
И каждый раз, когда пользователь нажимает на сообщение, я запускаю этот запрос:
UPDATE Message
SET views = views + 1
WHERE messageId = ?
Конечно, messageId будет исходить из запроса GET при щелчке сообщения. Эта опция работает, но я подвержен риску, когда злоумышленники щелкают неограниченное количество раз по сообщению, увеличивая количество просмотров без контроля.
2-й вариант
На этот раз в базе данных я мог бы иметь две таблицы:
Message(massageId, writerId, body)
Views(viewId, messageId, visitorId)
Каждый раз, когда пользователь нажимает на сообщение, я проверяю, просматривал ли пользователь это сообщение:
SELECT viewId
FROM Views
WHERE visitorId = ? AND messageId = ?
Если этот запрос возвращает строку, то я не увеличит количество просмотров. В противном случае я бы увеличил количество просмотров, добавив их:
INSERT INTO Views
VALUES (?, ?, ?);
Этот параметр запрещает фермы кликов, поэтому пользователь может увеличить количество просмотров сообщения только один раз. Но это также создает таблицу представлений, в которую записывается каждый просмотр, поэтому он будет расти очень быстро.
Стоит ли иметь еще одну таблицу для предотвращения ферм кликов, возможно, рискуя эффективностью и хранилищем, поскольку новая таблица будет очень длинный? Если у вас есть другие идеи, я буду рад их услышать.