PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Was ist der beste Weg, um eine Viele-zu-Viele-Beziehung zu modellieren?

Ein geeignetes Modell, das alles zulässt, was Sie benötigen, und gleichzeitig die referenzielle Integrität erzwingt, könnte wie folgt aussehen:

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)
);

Wenn derselbe Kontakt niemals in mehr als einer Rolle für dasselbe Produkt agieren kann, nehmen Sie die Rolle nicht in den PK auf:

, PRIMARY KEY (product_id, contact_id)

Dadurch kann einfach eine Zeile zu product_role hinzugefügt werden zu ermöglichen und zusätzliche Art der Kontaktaufnahme.

Wenn es nur eine Handvoll unterschiedlicher Rollen gibt, ist der Datentyp "char" könnte für role_id praktisch sein .

Grundlagen: