Можно ли создать ограничение внешнего ключа, которое также требует, чтобы произвольная строка в родительской таблице имела определенное значение? - PullRequest
0 голосов
/ 05 ноября 2019

В качестве примера, скажем, у меня есть две упрощенные таблицы и ENUM:

CREATE TYPE role AS ENUM (
  'admin',
  'seller'
);

CREATE TABLE users (
  id serial PRIMARY KEY,
  role role NOT NULL
);

CREATE TABLE orders (
  id serial PRIMARY KEY,
  seller_id int NOT NULL REFERENCES users(id), -- Should only allow for 'role' of 'seller'
  cost currency NOT NULL
);

Чтобы создать заказ, должен быть соответствующий пользователь, который отвечал за продажу. Только пользователь с role из seller должен иметь возможность создать заказ (например, пользователь с role из admin не должен быть в состоянии seller).

Однако пользователь может иметь несколько ролей. В настоящее время нет проверки на уровне базы данных, чтобы гарантировать, что seller_id может ссылаться только на user с role из seller. Проверив документацию по договорам , я не совсем уверен, что это возможно без создания другой таблицы специально для продавца (даже если в остальном они функционируют точно так же).

Есть ли что-то очевидное, что я упускаю?

1 Ответ

0 голосов
/ 05 ноября 2019

Обычным способом решения подобных проблем является создание таблицы Seller, которая содержит только столбец ID с внешним ключом, равным User.ID, поэтому он описывает этого пользователя как продавца и когда вам требуется User для того, чтобы быть продающим пользователем (например, seller_id из Order), у вас есть внешний ключ не для User, а для Seller вместо.

...