【问题标题】:stored procedures vs multiple queries (aws ec2-rds-postgres)存储过程与多个查询(aws ec2-rds-postgres)
【发布时间】: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


【解决方案1】:

不,一点也不夸张。您将拥有干净和优化的数据设计、抢先的数据质量和一致性、可扩展性、简单且高性能的查询、出色的代码可读性等,所有这些都以四个超薄表为代价。请。另请注意,数组不能很好地扩展。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 2021-01-01
    • 2016-02-25
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多