Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Лимит личных сообщений


Автор: ihb0 28.5.2014, 21:18
Добрый день.
Вопрос такого плана.
Пользователи обмениваются личными сообщениями(ЛС). ЛС хранятся в БД, в таблице ЛС имеем, помимо прочего, поля owner_id и created_at.
Как лучше реализовать лимиты на кол-во сообщений от пользователя в единицу времени?

Автор: ksnk 28.5.2014, 21:30
ihb0,  а зачем лимиты? Для предотвращения спама? Спамеров должен банить модератор по заявке других пользователей (кнопка "пожаловаться на спам")

Для предотвращения совсем уж идиотского спама - можно смотреть на время последнего отправленного сообщения (хранить в данных пользователя) и если отсылка идет очень часто - говорить что-то неприличное и пусть ждет.

Автор: _Y_ 29.5.2014, 07:54
Я бы, конечно, сделал так, как посоветовал ksnk,  но если ставить задачей именно лимит сообщений в единицу времени, то только хранить время каждого сообщения и каждый раз проверять.

Если в таблице хранится время для всех сообщений, то (сколь помню синтаксис SQL):
Код

SELECT COUNT(*) FROM Msg WHERE Msg.user = "Pupkin" AND  Msg.time > (NOW() - 1000);

1000 здесь - время за которое проверяется количество сообщений.

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

Автор: Akina 29.5.2014, 09:39
Цитата(ihb0 @  28.5.2014,  22:18 Найти цитируемый пост)
 лимиты на кол-во сообщений от пользователя в единицу времени? 

Проверять, что за требуемый диапазон времени количество сообщений менее установленного лимита. Иначе отказывать. В любом случае это отдельный запрос к БД - никуда не деваться.

Автор: ihb0 29.5.2014, 18:06
В целом у меня аналогичные мысли, но назвать это изящным и правильным решением я не могу. Слишком высокая нагрузка на БД предполагает быть для такого минорного функционала.
А лимиты - для предотвращения спама в его проявлениях(как часть функционала).
Будем подумать. Спасибо.

Автор: _Y_ 29.5.2014, 18:40
ihb0, думаю, если хранить время в отдельной таблице и убирать "устаревшие" записи, нагрузка может быть и поменьше.

Автор: Akina 29.5.2014, 20:28
Цитата(ihb0 @  29.5.2014,  19:06 Найти цитируемый пост)
Слишком высокая нагрузка на БД предполагает быть для такого минорного функционала.

Ну так вынеси эту логику на сервер, какие проблемы-то? а статистику там вообще можно кэшировать.

Автор: ksnk 29.5.2014, 20:40
Если послать личное сообщение может только зарегистрированный пользователь, то можно просто хранить информацию о времени последнего отправленного сообщения в сессии. Да и количество, вероятно, тоже. Тогда обычной задержки между сообщениями может хватить. В базу можно не лазить. 

А вот авторизация-реавторизация со сбросом сессии (очисткой кук) - должна быть как-то отдельно отработана. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)