Bạn nên viết lại truy vấn dưới dạng:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
Mặc dù điều này có vẻ ít súc tích hơn và một trình hoạch định truy vấn tốt sẽ thấy những gì bạn đang cố gắng thực hiện và chạy truy vấn phụ tương quan của bạn như tham gia ở trên thay vào đó, một trình hoạch định truy vấn xấu có thể sẽ thực hiện quét chỉ mục payments.id_customer
(giả sử bạn có một chỉ mục có liên quan ) (hoặc tệ hơn là quét bảng) thay vì thực hiện mọi thứ theo cách hiệu quả hơn. Ngay cả một trình hoạch định truy vấn tốt cũng có thể không thấy tối ưu hóa nếu sự sắp xếp của truy vấn này được gói trong một cái gì đó phức tạp hơn. Thể hiện mối quan hệ dưới dạng tham gia thay vì truy vấn phụ có thể tạo ra nhiều sự khác biệt hơn là thay đổi cấu trúc dữ liệu của bạn.
Như Jeff nói, bất kỳ sự không chuẩn hóa nào cũng cần được xem xét cẩn thận - nó có thể mang lại hiệu suất tăng dễ dàng, đặc biệt cho một số mục đích báo cáo, nhưng có thể dẫn đến sự không nhất quán do lỗi trong logic kinh doanh hỗ trợ.
Như một lưu ý phụ: Rõ ràng tôi không biết doanh nghiệp của bạn vì vậy tôi có thể thiếu một cái gì đó, nhưng các mối quan hệ trên bàn của bạn có vẻ kỳ lạ đối với tôi. Họ ngụ ý rằng bạn không bao giờ có thể có nhiều hơn một dự án với cùng một khách hàng thường không đúng với kinh nghiệm của tôi, ít nhất là trong một khoảng thời gian dài.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
hoặc nếu ít được chuẩn hóa (mặc dù tôi nghi ngờ điều đó là cần thiết):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
Tất nhiên là vẫn giảm khả năng dự án chung với hai khách hàng ...