Как справиться с фиксированным максимальным количеством сообщений, которые пользователь может разместить в течение определенного периода времени? - PullRequest
0 голосов
/ 14 июля 2020

Извините за титул.

Пользователи могут иметь не более 3 активных сообщений, и каждое сообщение будет активным в течение 48 часов.

Я думал просто поставить active_post_{1/2/3}_id и active_post_{1/2/3}_expires_at в таблице users, но интересно, есть ли лучший способ справиться с чем-то вроде этого.

1 Ответ

1 голос
/ 14 июля 2020

Я бы сохранил только временную метку сообщения и использовал логики среднего уровня 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 для принудительного применения этого ограничения, тогда вам нужно будет добавить триггеры в микс.

...