Как проверить связь между аргументами функции? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть несколько функций 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, могут быть ненадежными, как следует проверить правильность отношения, чтобы доказать, что данные верны для нашего пользователя, продуктов, отношений местоположения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...