Sorguyu şu şekilde yeniden yazmak daha iyi olur:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
Bu daha az özlü görünmekle birlikte, iyi bir sorgu planlayıcısı ne yapmaya çalıştığınızı görecek ve yukarıdaki alt üye olarak ilişkili alt sorgunuzu çalıştırmaya devam edecektir, bunun yerine, kötü bir sorgu planlayıcısı bir dizin taraması yaparak sona erebilir payments.id_customer
(ilgili bir dizine sahip olduğunuzu varsayarak) ) (ya da daha kötüsü, tablo taraması) işleri daha verimli yapmak yerine. İyi bir sorgu planlayıcısı bile, bu sorgunun düzenlenmesi daha karmaşık bir şeye sarılırsa optimizasyonu göremeyebilir. İlişkiyi bir alt sorgu yerine bir birleştirme olarak ifade etmek, veri yapınızı değiştirmekten daha fazla fark yaratabilir.
Jeff'in dediği gibi, herhangi bir normalleştirme, dikkatle değerlendirilmelidir - özellikle bazı raporlama amaçları için kolay performans artışı sağlayabilir, ancak destekleyici iş mantığındaki hatalar nedeniyle tutarsızlığa neden olabilir.
Yan not olarak: Açıkçası işinizi bilmiyorum bu yüzden bir şeyleri kaçırabilirim, ama masa ilişkileriniz bana tuhaf geliyor. En azından uzun bir süre boyunca, benim deneyimimde genellikle doğru olmayan aynı müşteriyle asla birden fazla projeye sahip olamayacağınız anlamına gelir.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
veya daha az normalleştirilmiş olmak gerekirse (bunun gerekli olacağından şüpheliyim):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
Tabii ki hala iki müşteriyle ortak bir proje olasılığını düşürüyor ...