Подходящ модел, който позволява всичко, от което се нуждаете, като същевременно налага референтна цялост, може да изглежда така:
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)
);
Ако един и същ контакт никога не може да изпълнява повече от една роля за един и същ продукт, не включвайте ролята в PK:
, PRIMARY KEY (product_id, contact_id)
Това позволява просто да добавите ред към product_role
за разрешаване и допълнителен тип контакт.
Ако има само ръка, пълна с отделни роли, типът данни "char"
може да е удобно за role_id
.
Основи: