En riktig modell som tillåter allt du behöver samtidigt som den upprätthåller referensintegritet kan se ut så här:
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)
);
Om samma kontakt aldrig kan agera i mer än en roll för samma produkt, inkludera inte rollen i PK:
, PRIMARY KEY (product_id, contact_id)
Detta gör det möjligt att helt enkelt lägga till en rad i product_role
för att tillåta och ytterligare typ av kontakt.
Om det bara finns en hand full av distinkta roller, datatypen "char"
kan vara praktiskt för role_id
.
Grunderna: