Een goed model dat alles toelaat wat je nodig hebt en tegelijkertijd de referentiële integriteit afdwingt, kan er als volgt uitzien:
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)
);
Als dezelfde contactpersoon nooit meer dan één rol voor hetzelfde product kan vervullen, neem de rol dan niet op in de PK:
, PRIMARY KEY (product_id, contact_id)
Dit maakt het eenvoudig om een rij toe te voegen aan product_role
om een extra type contact toe te staan.
Als er maar een handvol verschillende rollen is, is het gegevenstype "char"
kan handig zijn voor role_id
.
Basis: