บทความนี้จะอธิบายถึงเทคนิคการตัด Column max_age ออกจากตารางเก็บช่วงอายุ เพื่อลดความซ้ำซ้อนของข้อมูล (Data Redundancy) โดยยังคงประสิทธิภาพในการ Query ไว้ครบถ้วน
เทคนิคการลดรูปตาราง: การจัดการช่วงอายุแบบ Dynamic โดยตัด max_age
ในการออกแบบระบบที่ต้องเก็บ “ช่วงอายุ” (Age Range) เช่น ขั้นตอนพัฒนาการของสมอง หรือเกณฑ์ภาษี หลายคนมักออกแบบตารางให้มีทั้ง min_age และ max_age ซึ่งมักจะเจอปัญหา “ข้อมูลขัดแย้งกันเอง” เช่น แถวที่หนึ่งจบที่ 8 แต่แถวที่สองเริ่มที่ 10 (เกิดช่องว่าง) หรือแถวที่สองเริ่มที่ 7 (เกิดช่วงทับซ้อน)
ทางเลือกที่ดีกว่าคือการเก็บเพียง min_age (จุดเริ่มต้น) เพียงอย่างเดียว
ปรับโครงสร้างตารางใหม่ (The Lean Structure)
จากเดิมที่เราต้องคีย์ข้อมูลสองฝั่ง เราจะเหลือเพียงการกำหนด “จุดเปลี่ยน” ของช่วงอายุเท่านั้น
Table: brain_development_stages
| table_id | stage_name | min_age | key_characteristic |
| 1 | Childhood | 0 | Rapid Growth |
| 3 | Adolescence | 9 | High Neuroplasticity |
| 15 | Golden Age | 32 | Peak Stability |
หมายเหตุ: table_id จะกระโดดอย่างไรก็ได้ เพราะเราจะยึด min_age เป็นหลักในการเรียงลำดับ
วิธีการ Query ข้อมูล (The Logic)
เมื่อเราไม่มี max_age ในตาราง เราจะใช้ความสามารถของ Window Function ใน SQL ที่ชื่อว่า LEAD () เพื่อ “มองข้ามไปยังแถวถัดไป” และนำค่า min_age ของแถวถัดไปมาลบออกด้วย 1 เพื่อสร้างเป็น end_range แบบเสมือน
SQL สำหรับสร้าง Dynamic Range
SQL
SELECT stage_name, min_age AS start_range, -- มองไปที่แถวถัดไป (เรียงตามอายุ) แล้วลบ 1 ถ้าไม่มีแถวถัดไปให้จบที่ 150 COALESCE (LEAD (min_age) OVER (ORDER BY min_age) - 1, 150) AS end_range, key_characteristic
FROM brain_development_stages;