PlusMagi's Blog By Pitt Phunsanit Database ฐานข้อมูลระดับจังหวัด อำเภอ ตำบล

ฐานข้อมูลระดับจังหวัด อำเภอ ตำบล

ในโลกของการพัฒนาซอฟต์แวร์ที่ต้องจัดการกับข้อมูลทางภูมิศาสตร์ของประเทศไทย (จังหวัด, อำเภอ, ตำบล) การดึงข้อมูลที่มีความสัมพันธ์แบบลำดับชั้น (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

  1. ประสิทธิภาพสูง: Recursive CTE ถูกออกแบบมาเพื่อจัดการความสัมพันธ์แบบลำดับชั้นโดยเฉพาะ ทำให้ Query เร็วกว่าการทำ Join แบบซ้ำๆ
  2. JSONB Native Support: การรองรับ JSONB อย่างเต็มรูปแบบ ช่วยให้เราสามารถส่งข้อมูลที่ซับซ้อนในรูปแบบเดียว (Single API Call) โดยไม่ต้องเขียนโค้ดจัดการโครงสร้างข้อมูลเองหลายขั้นตอน

การใช้ PostgreSQL ในลักษณะนี้ไม่เพียงแต่ช่วยลดความซับซ้อนของโค้ด Backend แต่ยังเพิ่มประสิทธิภาพในการเรียกใช้งานฐานข้อมูลได้อย่างมหาศาล ทำให้ระบบของคุณมีความเสถียรและพร้อมรองรับการขยายตัวในอนาคตครับ

Exit mobile version