程序数据库代码与多个数据库调用

时间:2016-06-19 18:14:09

标签: sql node.js database plpgsql

所以这是一个非常高级的问题......

我正在设计一个数据库,我不确定在哪里放置管理复杂查询的过程逻辑。我看到两个可能的选项,如下所示:

1)在程序数据库代码中定义逻辑。

例如,在数据库中(例如:PLpgSQL):

create function A …
create function B …
create function C …
create function main {
    a = select * from A() …
    b = select * from B() … where a …
    c = select * from C() … where b …
    return c;
}

然后在周围的服务器环境中(例如:Node.js):

result = query(‘main’);

2)在周围的服务器环境中定义逻辑,只需对更简单的数据库函数进行多个数据库调用

例如,在数据库中:

create function A …
create function B …
create function C …

然后在周围的服务器环境中:

a = query(‘A’);
b = query(‘B … where a …’);
c = query(‘C … where b …’);

基本上我要问的是将代码放入过程数据库语言与在周围服务器环境中编写查询的优点,和/或与运行过程数据库代码相关的速度权衡与从周围服务器进行多个数据库调用环境。

谢谢! :)

1 个答案:

答案 0 :(得分:1)

优秀但有争议的问题。我在这里有很多经验,所以我可以这么说:

  1. 保存往返只有在你可以节省很多时间时才有道理,
  2. 真正的好处在于其他地方。
  3. 存储过程的最大好处是,它们使您能够考虑封装接口背后的功能,然后优化该功能。换句话说,保存2次往返并不是什么大问题,但能够优化所涉及的查询通常可以节省更多。如果接口是理智的,并且封装良好,这将带来显着的好处。

    主要的缺点与以下事实有关:人们可能滥用存储过程,在其中放入非事务性事物(如发送电子邮件)等,并且通常您无法有效地扩展参数列表这一事实没有破坏封装合同(我不认为可变函数是一个主要的解决方案)。 Oracle当然有基于版本的版本来帮助解决后一个问题,但PostgreSQL没有。而不是在postgresql上,我倾向于将服务定位器编写到存储过程来修复该问题。