Ba loại quan hệ (cardinality) giữa hai thực thể và cách hiện thực bằng khóa:
- Một–một (1:1): mỗi hàng bên A ứng với tối đa một hàng bên B (user ↔ hồ sơ chi tiết). Hiện thực: đặt FK có ràng buộc UNIQUE ở một bên, hoặc gộp chung một bảng.
- Một–nhiều (1:N): một hàng A liên kết nhiều hàng B, mỗi B thuộc một A (khách hàng ↔ đơn hàng). Hiện thực: đặt FK ở phía "nhiều" (bảng
orderscó cộtcustomer_id). Đây là quan hệ phổ biến nhất. - Nhiều–nhiều (M:N): nhiều A liên kết nhiều B (sinh viên ↔ môn học). Quan hệ quan hệ không thể biểu diễn trực tiếp → cần bảng nối (junction / associative table) trung gian, chứa FK tới cả hai bảng, thường composite PK
(student_id, course_id). Có thể thêm cột cho chính quan hệ (ngày đăng ký, điểm).
sql
-- Bảng nối cho quan hệ nhiều-nhiều sinh viên ↔ môn học
CREATE TABLE enrollments (
student_id INT REFERENCES students(id),
course_id INT REFERENCES courses(id),
enrolled_at DATE,
PRIMARY KEY (student_id, course_id)
);Bảng nối biến một M:N thành hai quan hệ 1:N. Đây là câu hỏi thiết kế nền tảng — thiếu bảng nối là lỗi mô hình hóa hay gặp.
Hai trường hợp hay gặp thêm: quan hệ tự tham chiếu (employees.manager_id REFERENCES employees(id) — cây tổ chức, danh mục cha–con), và anti-pattern polymorphic association (comments(commentable_type, commentable_id) trỏ tới nhiều bảng — không gắn được FK, khó bảo trì; thay bằng nhiều cột FK + CHECK hoặc bảng nối riêng cho mỗi loại).