sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cuál es la mejor manera de modelar una relación de muchos a muchos?

Un modelo adecuado que permita todo lo que necesita al mismo tiempo que hace cumplir la integridad referencial podría verse así:

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

Si el mismo contacto nunca puede actuar en más de una función para el mismo producto, no incluya la función en el PK:

, PRIMARY KEY (product_id, contact_id)

Esto permite simplemente agregar una fila a product_role para permitir un tipo adicional de contacto.

Si solo hay un puñado de roles distintos, el tipo de datos "char" podría ser conveniente para role_id .

Conceptos básicos: