Câu hỏi rất hay 👍 — vì khoá ngoại (foreign key) là một trong những phần quan trọng nhất của thiết kế cơ sở dữ liệu quan hệ (SQL).
Tuy nhiên, không phải lúc nào cũng nên dùng, và có những trường hợp nên tránh để đảm bảo hiệu năng.
Dùng foreign key khi bạn muốn đảm bảo toàn vẹn dữ liệu (data integrity) giữa các bảng có quan hệ logic.
Ví dụ:
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100) ); CREATE TABLE posts ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT, title VARCHAR(255), FOREIGN KEY (user_id) REFERENCES users(id) );
post
phải thuộc về một user
.user
bị xóa → bạn có thể chọn hành vi:
ON DELETE CASCADE
→ xóa luôn các post
của họ.ON DELETE SET NULL
→ đặt user_id
= NULL.RESTRICT
→ không cho xóa nếu còn bài viết.✅ Nên dùng khi:
👉 Giải pháp: kiểm tra logic bằng code (PHP, Python, v.v.), không ràng buộc ở SQL.
Ví dụ: hệ thống có hàng triệu bản ghi, hoặc log tracking.
👉 Giải pháp: dùng index và kiểm tra bằng ứng dụng.
FOREIGN_KEY_CHECKS=0
,Trường hợp | Nên dùng FK | Không nên dùng FK |
---|---|---|
Dữ liệu nhỏ, quan hệ chặt | ✅ | ❌ |
Hệ thống microservice | ❌ | ✅ |
Muốn đảm bảo toàn vẹn dữ liệu | ✅ | ❌ |
Hệ thống log, cache, tạm | ❌ | ✅ |
Khi cần auto delete/update cascade | ✅ | ❌ |
Khi import hoặc đồng bộ dữ liệu lớn | ❌ (tạm thời) | ✅ |