PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Qual a melhor maneira de modelar um relacionamento muitos para muitos


Um modelo adequado que permite tudo o que você precisa enquanto impõe a integridade referencial pode ser assim:
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)
);

Se o mesmo contato nunca puder atuar em mais de uma função para o mesmo produto, não inclua a função no PK:
, PRIMARY KEY (product_id, contact_id)

Isso permite simplesmente adicionar uma linha ao product_role para permitir e tipo adicional de contato.

Se houver apenas uma mão cheia de funções distintas, o tipo de dados "char" pode ser conveniente para role_id .

Fundamentos: