Właściwy model, który pozwala na wszystko, czego potrzebujesz, jednocześnie egzekwując integralność referencyjną, może wyglądać tak:
CREATE TABLE contact (
contact_id serial PRIMARY KEY
, name text
, phone text
, ...
);
CREATE TABLE product (
product_id serial PRIMARY KEY
, ...
);
CREATE TABLE product_role (
role_id int PRIMARY KEY
, role text UNIQUE
);
CREATE TABLE product_contact (
product_id int REFERENCES product
, contact_id int REFERENCES contact
, role_id int REFERENCES product_role
, PRIMARY KEY (product_id, contact_id, role_id)
);
Jeśli ten sam kontakt nigdy nie może działać w więcej niż jednej roli dla tego samego produktu, nie dołączaj tej roli do PK:
, PRIMARY KEY (product_id, contact_id)
Pozwala to po prostu dodać wiersz do product_role
aby zezwolić i dodatkowy rodzaj kontaktu.
Jeśli istnieje tylko garstka różnych ról, typ danych "char"
może być wygodne dla role_id
.
Podstawy: