En ordentlig model, der tillader alt, hvad du har brug for, og samtidig håndhæver referentiel integritet, kunne se sådan ud:
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)
);
Hvis den samme kontakt aldrig kan optræde i mere end én rolle for det samme produkt, skal du ikke inkludere rollen i PK:
, PRIMARY KEY (product_id, contact_id)
Dette gør det muligt blot at tilføje en række til product_role
for at tillade og yderligere type kontakt.
Hvis der kun er en hånd fuld af distinkte roller, er datatypen "char"
kan være praktisk til role_id
.
Grundlæggende: