Я бы сохранил только временную метку сообщения и использовал логики среднего уровня c, чтобы ограничить количество активных сообщений до трех.
Если у вас есть такая таблица:
create table posts (
id int generated always as identity,
user_id int not null references users(id),
created_at timestamptz not null,
post_text text not null
);
Вы можете получить количество активных сообщений с помощью этого запроса и отключить возможность пользователя создавать новые сообщения, если результат больше трех.
select count(*)
from posts
where user_id = ?
and created_at > now() - interval '48 hours';
Это может быть побеждено решительным злоумышленником через несколько активных сеансов в вашем приложении, но если это вызывает беспокойство, я бы использовал тот же logi c, чтобы ограничить видимые сообщения только тремя на пользователя. При вытягивании списка сообщений для отображения:
with rnums as (
select user_id, created_at, post_text,
row_number() over (partition by user_id
order by created_at desc) as rn
from posts
where created_at > now() - interval '48 hours'
)
select user_id, created_at, post_text
from rnums
where rn <= 3
order by user_id, created_at desc;
Если вы хотите использовать PostgreSQL для принудительного применения этого ограничения, тогда вам нужно будет добавить триггеры в микс.