инфу. Если он уже наинсёртил в эту таблицу 5 штук, слать его куда подальше, лимит мол на посты.
В коде само собой вся эта логика прописана. В начале селектится count его инсёртов, и если он уже 5 или больше, то досвидос, а если нет, то инсёртим. Но если он будет спамить командой добавления, например 10 сообщений отправит в миллисекунду, то логика эта идёт нафиг, и будет добавлено больше 5.
Всё что мне приходит в голову, так это обернуть это дело в транзакцию и залочить таблицу полностью. Но нормальное ли это решение? Люди то часто инсёртят, и не знаю норм ли что вся таблица в эти моменты будет заблокирована.
вы хотите сделать rate limit Запросов к телеграмму через базу и количество вставок? чего?
триггер на вставку можно сделать, как вариант, для проверки внутри базы хотя сам я против триггеров.. возможно можно что-то придумать с ограничением уникальности, но тут я не уверен
Нет, представь что это рынок. Чувак выставляет товар, и одновременно может всего 5 его товаров на рынке торчать. Больше 5 он выставить не может. Но если он хорошенько поспамит, то выставит.
А почему против триггеров? Они expensive, или шо там с ними?
просто личное мнение, не нравится логика на уровне базы, имхо, лучше в коде, но это вечный холивар) по факту, что вы сделаете запрос на количество из кода, что в триггере, разницы большой быть не должно
Есть как минимум два "стандартных" решения: 1. Использовать serializable, проверять COUNT(*) в транзакции, откатывать, если больше 5 (всё это можно поместить в триггер). 2. Использовать какой-то из обычных трюков работы на Read Committed (добавить поле-счётчик "штук" в таблицу пользователей и обновлять его; или блокировать запись этого пользователя (в таблице пользователей, опять-таки) перед выборкой (тут не уверен, я таким не увлекаюсь); и т.п.).
Пасибки за инфу, сейчас за serializable почитаю
Я сразу предупрежу: 1. Чтобы это решение нормально работало в PostgreSQL, все транзакции (по крайней мере, относящиеся к тем же данным), должны использовать этот уровень. 2. Про то, как им правильно пользоваться, советую читать только документацию PostgreSQL ("в интернете" именно по этому поводу мне почему-то часто попадается просто феерическая чушь... хотя, может, это мне так "везёт").
Обсуждают сегодня