У меня есть несколько функций postgres, которые принимают ряд аргументов для записи в несколько таблиц.
fn_trade
(
_product_id BIGINT[],
_user_id BIGINT[],
_location_id BIGINT
)
Поскольку аргументы исходят от клиента или сервера Node.js, мне нужно проверить, что данные существуют (обрабатываются ограничениями FK, но не в случае BIGINT []), и мне нужно подтвердить, что аргументы ' отношения действительны. Например, я должен проверить, что 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] для продуктов [1,2,3,4] в Канаде. Пользователи могут иметь элементы в разных местах, а пользователи могут перемещаться в разные места.
При вставке user_id[]
и product_id[]
в trade
проверка отдельных идентификаторов не выполняется автоматически. Я не знаю, возможно ли установить значения в массиве как FKs, поэтому проверка здесь ручная. Я должен гарантировать, что идентификаторы [1,2,3,4] все существуют для продукта.
А как же отношения? Мне нужно проверить, что идентификаторы также принадлежат пользователям [1,2].
Принадлежность к пользователю недостаточно. Продукты должны существовать в том же месте, где происходит торговля.
А для пользователей мне нужно знать, возможно ли им торговать. Если они живут в разных местах (Канада против Тайваня), торговля не может состояться.
Поскольку данные клиента зависят от БД, а данные, передаваемые в fn_trade
, могут быть ненадежными, как следует проверить правильность отношения, чтобы доказать, что данные верны для нашего пользователя, продуктов, отношений местоположения?