Ви б краще написати запит як:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
Хоча це здається менш стислим, і хороший планувальник запитів побачить, що ви намагаєтеся зробити, і запустить ваш кореляційний підзапит як приєднується вище, але поганий планувальник запитів може в кінцевому підсумку зробити індексне сканування payments.id_customer
(якщо у вас є відповідний індекс ) (або ще гірше, сканування таблиці), а не робити ефективніше. Навіть хороший планувальник запитів може не побачити оптимізації, якщо розташування цього запиту буде обгорнуто чимось складнішим. Висловлення відносин як з'єднання, а не підзапиту може мати більше значення, ніж зміна вашої структури даних.
За словами Джеффа, будь-яку денормалізацію слід розглядати обережно - це може принести легке підвищення продуктивності, особливо для деяких цілей звітності, але може призвести до невідповідності через помилки в підтримуваній бізнес-логіці.
Як зауваження: Очевидно, я не знаю вашого бізнесу, щоб я міг чогось бракувати, але ваші стосунки зі столом мені здаються дивними. Вони означають, що ви ніколи не можете мати більше одного проекту з тим самим замовником, що, як правило, не відповідає дійсності, принаймні протягом тривалого періоду.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
або якщо це менш нормалізується (хоча я сумніваюся, що це буде потрібно):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
Зрозуміло, що все-таки знижується можливість спільного проекту з двома замовниками ...