对不起,标题。
用户最多可以拥有 3 个活跃帖子,每个帖子的活跃时间为 48 小时。
我在想只是把active_post_{1/2/3}_id
与active_post_{1/2/3}_expires_at
上users
表中,但不知道是否有要处理这样的事情更好的方法。
我只会存储帖子的时间戳,并使用中间层逻辑将活动帖子的数量限制为三个。
如果你有一张像这样的桌子:
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';
这可能会被确定的攻击者通过应用程序中的多个活动会话击败,但如果这是一个问题,那么我将使用相同的逻辑将可见帖子限制为每个用户只能显示三个。拉取要显示的帖子列表时:
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 来强制执行此约束,那么您需要将触发器纳入其中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句