Một mô hình phù hợp cho phép mọi thứ bạn cần trong khi thực thi tính toàn vẹn tham chiếu có thể trông như thế này:
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)
);
Nếu cùng một địa chỉ liên hệ không bao giờ có thể hoạt động nhiều hơn một vai trò cho cùng một sản phẩm, thì đừng bao gồm vai trò đó trong PK:
, PRIMARY KEY (product_id, contact_id)
Điều này cho phép chỉ cần thêm một hàng vào product_role
để cho phép và loại liên hệ bổ sung.
Nếu chỉ có một bàn tay chứa đầy các vai trò riêng biệt, thì kiểu dữ liệu "char"
có thể thuận tiện cho role_id
.
Khái niệm cơ bản: