ในโลกของการพัฒนาซอฟต์แวร์ที่ต้องจัดการกับข้อมูลทางภูมิศาสตร์ของประเทศไทย (จังหวัด, อำเภอ, ตำบล) การดึงข้อมูลที่มีความสัมพันธ์แบบลำดับชั้น (Hierarchical Data) เป็นโจทย์ที่นักพัฒนาระบบทุกคนต้องเจอ หากใช้ฐานข้อมูลเชิงสัมพันธ์ทั่วไป (Relational Database) การเขียนโค้ดเพื่อไล่ระดับการเลือกจาก Parent ไป Child อาจยุ่งยากและมีประสิทธิภาพต่ำ
ในฐานะ System Specialist ที่เชี่ยวชาญด้านสถาปัตยกรรมระบบ เราขอแนะนำให้ใช้พลังของ PostgreSQL ซึ่งเป็นฐานข้อมูลที่โดดเด่นในการจัดการโครงสร้างข้อมูลแบบลำดับชั้น ด้วยคุณสมบัติขั้นสูงอย่าง Recursive CTE และ JSONB ทำให้การ Query ข้อมูลเหล่านี้ทำได้อย่างมีประสิทธิภาพและกระชับกว่าเดิมมาก
💡 หลักการทำงาน: การใช้ Recursive CTE ใน PostgreSQL
แทนที่จะเขียนโค้ดที่ต้องมีการเรียก API หลายครั้งตามลำดับ (เช่น เลือกจังหวัด -> เรียกอำเภอ -> เลือกตำบล) เราสามารถให้ PostgreSQL ทำหน้าที่ค้นหาความสัมพันธ์ทั้งหมดได้ด้วยคำสั่งเดียว โดยอาศัย Recursive Common Table Expression (CTE)
โครงสร้างตารางข้อมูล
สมมติว่าเรามีตารางหลักชื่อ geography ที่เก็บข้อมูลทุกระดับ และมีการกำหนดคอลัมน์ที่ระบุถึง Parent ID เพื่อเชื่อมโยงความสัมพันธ์:
id: รหัสเฉพาะของพื้นที่ (Primary Key)parent_id: รหัสของพื้นที่แม่ (ใช้สำหรับ CTE)level: ระดับของข้อมูล (1=จังหวัด, 2=อำเภอ, 3=ตำบล)name: ชื่อพื้นที่
ตัวอย่างโค้ด PostgreSQL: การค้นหาลำดับชั้น
เราจะใช้ Recursive CTE เพื่อไล่ระดับความสัมพันธ์จากราก (Root) ไปยังปลายทาง:
SQL
WITH RECURSIVE hierarchy AS (
-- Anchor Member: เริ่มต้นที่ระดับสูงสุด (เช่น จังหวัด)
SELECT
id, parent_id, level, name
FROM geography
WHERE level = 1 -- สมมติว่าจังหวัดคือระดับ 1
UNION ALL
-- Recursive Member: ค้นหา Child จาก Parent ที่พบแล้ว
SELECT
g.id, g.parent_id, g.level, g.name
FROM geography g
JOIN hierarchy h ON g.parent_id = h.id
)
SELECT * FROM hierarchy ORDER BY level, name;
คำอธิบาย: CTE นี้จะเริ่มจากแถวที่กำหนด (Anchor Member) และวนซ้ำ (Recursive Member) โดยการ Join ข้อมูลในตาราง geography กับผลลัพธ์ของตัวเอง จนกว่าจะไม่พบ Parent ID ที่เชื่อมโยงกันอีกต่อไป ทำให้ได้รายการข้อมูลทั้งหมดตามลำดับชั้นอย่างสมบูรณ์
🚀 การแปลงเป็น JSONB ด้วย PostgreSQL (Advanced Technique)
ในทางปฏิบัติจริง ระบบ Front-end สมัยใหม่มักต้องการข้อมูลที่อยู่ในรูปแบบ JSON เพื่อความรวดเร็วในการประมวลผล แทนที่จะดึงมาเป็นแถวๆ เราสามารถใช้ฟังก์ชัน jsonb_agg() ร่วมกับ CTE ได้:
SQL
WITH RECURSIVE hierarchy AS (
-- (CTE Definition เหมือนเดิม)
SELECT id, parent_id, level, name FROM geography WHERE level = 1
UNION ALL
SELECT g.id, g.parent_id, g.level, g.name
FROM geography g JOIN hierarchy h ON g.parent_id = h.id
)
SELECT jsonb_agg(jsonb_build_object('id', id, 'name', name, 'level', level)) AS hierarchical_data
FROM hierarchy;
ผลลัพธ์ที่ได้คือ JSONB Object ที่มีโครงสร้างข้อมูลทั้งหมดในรูปแบบเดียว ทำให้ Backend สามารถนำไปประมวลผลและส่งให้ Client ได้อย่างรวดเร็วที่สุด ซึ่งเป็นแนวทางของ Senior Architect ในการออกแบบ API ครับ
✅ สรุปและข้อดีของการใช้ PostgreSQL
- ประสิทธิภาพสูง: Recursive CTE ถูกออกแบบมาเพื่อจัดการความสัมพันธ์แบบลำดับชั้นโดยเฉพาะ ทำให้ Query เร็วกว่าการทำ Join แบบซ้ำๆ
- JSONB Native Support: การรองรับ JSONB อย่างเต็มรูปแบบ ช่วยให้เราสามารถส่งข้อมูลที่ซับซ้อนในรูปแบบเดียว (Single API Call) โดยไม่ต้องเขียนโค้ดจัดการโครงสร้างข้อมูลเองหลายขั้นตอน
การใช้ PostgreSQL ในลักษณะนี้ไม่เพียงแต่ช่วยลดความซับซ้อนของโค้ด Backend แต่ยังเพิ่มประสิทธิภาพในการเรียกใช้งานฐานข้อมูลได้อย่างมหาศาล ทำให้ระบบของคุณมีความเสถียรและพร้อมรองรับการขยายตัวในอนาคตครับ