Model yang tepat yang memungkinkan semua yang Anda butuhkan saat menegakkan integritas referensial dapat terlihat seperti ini:
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)
);
Jika kontak yang sama tidak pernah dapat berperan dalam lebih dari satu peran untuk produk yang sama, jangan sertakan peran dalam PK:
, PRIMARY KEY (product_id, contact_id)
Ini memungkinkan untuk menambahkan baris ke product_role
untuk mengizinkan dan jenis kontak tambahan.
Jika hanya ada tangan yang penuh dengan peran yang berbeda, tipe data "char"
mungkin nyaman untuk role_id
.
Dasar-dasar: