我有多个postgres函数,它们接受许多参数以便在多个表上写入。
fn_trade
(
_product_id BIGINT[],
_user_id BIGINT[],
_location_id BIGINT
)
由于参数来自客户端或Node.js服务器,我需要验证数据是否存在(由FK约束处理,但不是在BIGINT []的情况下),我需要确认参数&# 39;关系是有效的。例如,我必须检查user
是否存在product
和location
,product
是否属于user
。这种检查的复杂性随着更多的争论而增长。我最终可能会得到10个以上的论点,检查他们之间的关系会很复杂而且成本很高。
通过尝试验证函数参数,我不知道自己是否错过了一张重要图片。这是正确的方法吗?有没有更好的方法来建立对论证关系的信心,以便始终预期填充的数据?
一种可能的方法可能是预测结果并检查写入完成后是否写入结果(否则回滚)?
Postgres 9.6 +
编辑:添加了一个示例来澄清问题
表格
location (id, name) -- e.g. 1, 'Canada'
user (id, name, location_id) -- e.g. 1, Jane, 1
product (id, name, user_id, location_id) -- e.g. 1, 'skates', 1, 1
trade (id, user_id[], product_id[]) -- e.g. 1, [1,2], [1,2,3,4]
当交易发生时,我需要确认给出的数据是否与数据库中的数据相匹配。
例如,我得到:
fn_trade
(
[1,2,3,4],
[1,2],
1
)
因此,加拿大产品[1,2,3,4]的用户[1,2]进行交易。用户可以将项目放在不同的位置,用户可以移动到不同的位置。
将user_id[]
和product_id[]
插入trade
时,对各个ID的检查不会自动进行。我不知道是否可以将数组中的值设置为FK,因此这里的检查是手动的。我需要保证产品存在ID [1,2,3,4]。
但关系怎么样?我需要检查id是否也属于用户[1,2]。
属于用户是不够的。产品应存在于交易发生的同一地点。
对于用户,我需要知道他们是否有可能进行交易。如果他们住在不同的地方(加拿大对台湾),那么交易就不会发生。
由于客户端数据依赖于数据库,并且传递给fn_trade
的数据可能不可靠,如何验证关系以证明数据对于我们的用户,产品,位置关系是真的?