คุณควรเขียนแบบสอบถามเป็น:
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
แน่นอนว่ายังคงลดความเป็นไปได้ของโครงการร่วมกับลูกค้าสองราย ...