куча разных таблиц со ссылаками на clientId, но в них же продублирован firmId, для более оптимальной выборки.
Можно ли силами бд проверять что firmId и clientId соответствуют друг другу? То есть чтобы нельзя было воткнуть в запись фирму и клиента из другой фирмы
Как вариант, могут помочь триггерные функции...
А что ты будешь делать когда кто-то отсоединит clientId от filmId
FK на clients (firmId, clientId) (но придётся добавить "лишний" индекс) или триггеры.
так это не гарантирует мне соответветствия что клиент в этой фирме
такого нет по бизнесу, ну и я привел частный случай, есть много сущностей где есть желание гарантировать такую консистентность
как?
Ну по идеи должен быть 1 источник истины
Хмм... почему? По-моему, гарантирует. Если нет — покажите пример.
это гарантирует только то что такая фирма и такой клиент есть, а я говорю про принадлежность клиента к фирме
И я говорю про принадлежность клиента к фирме. Я, наверное, чего-то не понимаю. :(
может и я не так понял) как ключ (firmId, clientId) будет гарантировать что у этого clientId в своей таблице стоит тот же firmId что и в ключе?
Потому, что https://t.me/pgsql/317773 Или я не так понял? Почему бы Вам, опять-таки, не показать пример таблиц (мне кажется, тут хватит и трёх)?
firms (id, name) clients (id, firmId) tickets (firmId, clientId, name)
CREATE TABLE firms ( id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, name text NOT NULL ); INSERT INTO firms(name) VALUES ('name'); CREATE TABLE clients ( id int GENERATED ALWAYS AS IDENTITY PRIMARY KEY, firmId int NOT NULL REFERENCES firms, UNIQUE (id, firmId) ); INSERT INTO clients(firmid) VALUES (1); CREATE TABLE tickets ( clientId int NOT NULL, firmId int NOT NULL, name text NOT NULL, FOREIGN KEY (firmId, clientId) REFERENCES clients(id, firmId) ); И потом INSERT INTO tickets(clientid, firmid, name) VALUES (1, 2, 'name1'); ERROR: insert or update on table "tickets" violates foreign key constraint "tickets_firmid_fkey"
Обсуждают сегодня