【发布时间】:2022-01-17 05:50:42
【问题描述】:
我正在开展一个项目,其中用户需要喜欢特定的内容。该项目在 aws ec2 实例上运行并使用 rds postgres 实例。
有一个单独的表,其中包含integer[] 类型的列,用于存储所有喜欢特定内容的用户的 ID。在将用户添加到数组之前,我应该检查 1-具有给定 id 的内容是否存在,以及 2-用户尚未喜欢该内容。
有两种方法可以做到这一点。通过 id 检索内容,如果不存在则返回 404。否则检索与该内容相关的行并检查与当前请求相关的用户的 id 是否已存在于数组中,如果存在则返回 400。否则将用户的 id 添加到数组中。
但这意味着对于这个特定请求,我正在对数据库执行三个查询,其中涉及从 ec2 实例到 rds 实例的三个网络调用。
第二种方法解决了这个问题。您只需要在 rds 实例中进行所有检查,这就是我写的:
create function like(client integer, content integer) returns integer as $$ begin
if(exists(select * from contents where id=content)) then
if(select client=any(likes) from "contentInteractions" where "contentId"=content) then
return 409;
else
if(not exists(select * from "contentInteraction" where "contentId"=content)) then
insert into "contentInteraction" ("contentId", likes) values (content, '{}');
end if;
update "contentInteraction" set likes = likes || client where "contentId"=content;
return 200;
end if;
else
return 404;
end if;
end; $$ language plpgsql;
所以,我的问题是,我是否无缘无故地把事情复杂化了?降低代码清晰度是否值得(因为任何阅读代码的人都应该参考迁移中此函数的定义)?
谢谢
【问题讨论】:
-
我认为复杂性来自于“
integer[]用于存储所有喜欢特定内容的用户的 id”。考虑一个标准化的设计。外键约束将解决有关内容存在和唯一约束的问题 - 非重复要求。微不足道,不是吗?
标签: postgresql amazon-web-services amazon-ec2 amazon-rds stored-functions