Sería mejor reescribir la consulta como:
SELECT payments.*
FROM customers
JOIN payments
ON payments.id_customer = customers.id
WHERE customers.id_project = 5
Si bien esto parece menos conciso y un buen planificador de consultas verá lo que está tratando de hacer y ejecutará su subconsulta correlacionada como la combinación anterior, un mal planificador de consultas puede terminar haciendo un análisis de índice de payments.id_customer
(suponiendo que tenga un índice relevante ) (o peor, escaneo de tablas) en lugar de hacer las cosas de la manera más eficiente. Incluso un buen planificador de consultas puede no ver la optimización si la disposición de esta consulta está envuelta en algo más complicado. Expresar la relación como una unión en lugar de una subconsulta puede hacer más diferencia que cambiar su estructura de datos.
Como dice Jeff, cualquier denormalización debe considerarse con cuidado: puede aumentar el rendimiento fácilmente, especialmente para algunos fines de informes, pero puede generar inconsistencias debido a errores en la lógica comercial de soporte.
Como nota al margen: Obviamente, no conozco su negocio, por lo que podría perderme algo, pero sus relaciones con la mesa me parecen extrañas. Implican que nunca puede tener más de un proyecto con el mismo cliente, lo que generalmente no es cierto en mi experiencia, al menos durante un largo período.
customer project payment
-------- -------- -------
pa_id
pr_id <-- payment
cu_id <-- customer
o si está menos normalizado (aunque dudo que sea necesario):
customer project payment
-------- -------- --------
pa_id
pr_id <-- payment
cu_id <-- customer
`------------- customer
Por supuesto, eso todavía descuenta la posibilidad de un proyecto conjunto con dos clientes ...