2017-07-18 38 views
2

所以我有一个PG函数create_order(语言是PL/PGSQL),它接受了很多参数。 我注意到,每次我修改参数名称,它的类型,或者如果我添加了一个新的说法,我不得不放弃功能(CREATE OR REPLACE不工作)PostgreSQL - 使用JSONB作为单一函数参数的任何缺点

所以我一直在想,如果我只是接受一个jsonb类型的单个参数,并把它称为一天......所以签名会看起来像create_order(args jsonb)

我的问题是

  1. 这被认为是不好的做法在PG“世界”(影响性能或其他某些方面)或者从编程的角度来看不好的做法
  2. 如果#1是不好的方法,最好是创建自定义复合类型并将其用作函数的参数?
+0

如果您更改其签名,重新创建函数有什么错误?无论如何,你必须更新电话,不是吗? – JGH

+0

我不会先使用它,因为你会有转换参数类型的缺点。第二个我已经用在我的时间和给你的要求(有些不变的变化)我认为这是一个更好的方法,我会去为它。即使在您使用它的代码中,每次都不需要更改(除了第一个,显然),您可以保持更好的可维护性。我没有把它作为答案加入,因为这是一个意见,我只是没有投票结束,因为这是一个很好的问题。 –

回答

1

我没有看到一个jsonb函数参数的大问题,除了单个参数可能使输入值更明显。但这不是文档无法解决的问题。

另一方面,我也看到签名更改时丢弃和重新创建函数没有问题。它可能提醒呼叫站点需要更新。

我想说,你应该采用适合你的方法,并且手头最好的问题最好从PostgreSQL的角度来看并不重要。

+0

丢弃和重新创建对我来说不是问题,但是当函数在其他函数中使用时,它会变得毛茸茸。然后,你必须级联删除并重新创建它们(除非我错过了某些东西?) – zam6ak

+0

函数之间不存在任何依赖关系,例如视图和表之间的依赖关系,因此您可以删除并重新创建在另一个函数中调用的函数。但是,如果签名发生变化,则必须更改调用函数以避免函数调用时出现运行时错误。但是你必须修改调用函数,对吧? –