PlusMagi's Blog By Pitt Phunsanit Backend,Database Tabulator Case Study: การทำ Master-Detail (Sub-Table) ขยายแถวเพื่อดูข้อมูลประเภทย่อย

Tabulator Case Study: การทำ Master-Detail (Sub-Table) ขยายแถวเพื่อดูข้อมูลประเภทย่อย

ในโลกของการพัฒนาซอฟต์แวร์ระดับองค์กร (Enterprise Application) ข้อมูลส่วนใหญ่มักไม่ได้ถูกจัดเก็บเป็นตารางเรียบๆ แต่มีความสัมพันธ์แบบลำดับชั้น (Hierarchical Data) เสมอ ไม่ว่าจะเป็นโครงสร้างหมวดหมู่สินค้าที่แตกย่อย หรือข้อมูลคำสั่งซื้อที่มีรายการสินค้าหลายชิ้น การแสดงผลข้อมูลเหล่านี้ให้ผู้ใช้งานเห็นภาพรวมทั้งหมดในหน้าจอเดียวโดยไม่ทำให้เกิดความสับสน คือโจทย์สำคัญด้าน User Experience (UX) ที่นักพัฒนาต้องเผชิญ

Master-Detail: แนวคิดและการประยุกต์ใช้ทางสถาปัตยกรรมข้อมูล

แนวคิด Master-Detail หรือการทำ Sub-Table ขยายแถว คือกลไกสำคัญที่ช่วยให้เราสามารถแสดงข้อมูลหลัก (Master) ในรูปแบบตาราง และเมื่อผู้ใช้โต้ตอบกับแถวใดแถวหนึ่ง ระบบจะทำการดึงและแสดงรายละเอียดปลีกย่อย (Detail/Sub-Table) ที่เกี่ยวข้องออกมาทันที โดยยังคงอยู่ในบริบทของหน้าจอเดิม การทำเช่นนี้ช่วยลดความซับซ้อนในการนำทาง (Navigation Complexity) และทำให้ผู้ใช้สามารถเปรียบเทียบข้อมูลระดับสูงกับระดับล่างได้อย่างรวดเร็ว

การจัดการ Master-Detail ด้วย PostgreSQL

ในมุมมองของ System Specialist การทำ Master-Detail ที่มีประสิทธิภาพไม่ได้ขึ้นอยู่กับการแสดงผล (View Layer) เพียงอย่างเดียว แต่ต้องอาศัยการออกแบบฐานข้อมูลและการดึงข้อมูลที่ชาญฉลาดจากฝั่ง Back-end ด้วย PostgreSQL เป็นเครื่องมือที่ทรงพลังในการจัดการโครงสร้างข้อมูลแบบลำดับชั้น เนื่องจากมีฟีเจอร์ขั้นสูง เช่น Common Table Expressions (CTE), JSONB และ Window Functions ที่ช่วยให้เราสามารถรวมชุดข้อมูลย่อยให้อยู่ในรูปแบบเดียวได้อย่างมีประสิทธิภาพ

ในการจำลองกรณีศึกษา (Case Study) ของการแสดงข้อมูลคำสั่งซื้อ (Order) และรายการสินค้า (Items) เราจะใช้การ Join ข้อมูลจากสองตารางหลัก คือ orders (Master) และ order_items (Detail) โดยการใช้ LEFT JOIN ร่วมกับ CTE จะช่วยให้เราสามารถดึงข้อมูล Master มาเป็นแถวหลัก และรวมข้อมูล Detail ทั้งหมดที่เกี่ยวข้องมาแสดงในรูปแบบที่พร้อมสำหรับการขยายแถวใน Front-end

ตัวอย่างการดึงข้อมูล Master-Detail ด้วย SQL

สมมติว่าเรามีตาราง orders และ order_items การเขียน Query ที่เหมาะสมที่สุดคือการ Join ข้อมูลเหล่านี้เพื่อสร้างชุดข้อมูลที่ครอบคลุม:

SQL

WITH master_orders AS ( -- กำหนดข้อมูล Master (คำสั่งซื้อหลัก) SELECT order_id, customer_name, order_date FROM orders WHERE order_id = 101) SELECT mo.order_id, mo.customer_name, mo.order_date, GROUP_CONCAT(oi.item_name ORDER BY oi.item_id) AS item_details FROM master_orders mo JOIN order_items oi ON mo.order_id = oi.order_id GROUP BY mo.order_id;

คำอธิบายโค้ด:
1. WITH master_orders AS (...): ใช้ CTE เพื่อจำกัดขอบเขตข้อมูล Master ให้เหลือเพียงรายการที่ต้องการดู (เช่น Order ID 101)
2. JOIN order_items oi ON mo.order_id = oi.order_id: เชื่อมโยงข้อมูล Master กับ Detail
3. GROUP_CONCAT(...): ฟังก์ชันนี้ (หรือการใช้ JSONB ในกรณีที่ซับซ้อนกว่า) จะรวมรายการสินค้าทั้งหมด (item_name) ที่เกี่ยวข้องกับ Order ID เดียวกัน ให้กลายเป็นสตริงเดียวในคอลัมน์ item_details ซึ่งจำลองการรวมข้อมูลย่อยให้อยู่ในแถวเดียวเพื่อรอการแสดงผลแบบขยายแถว

บทสรุปสำหรับสถาปนิกข้อมูล

การจัดการข้อมูลแบบ Master-Detail ไม่ใช่แค่เรื่องของ UI/UX แต่เป็นเรื่องของการออกแบบ Query และการจัดการข้อมูลในระดับฐานข้อมูลด้วย การใช้ฟีเจอร์ระดับสูงของ PostgreSQL เช่น CTEs และ Aggregate Functions อย่าง GROUP_CONCAT ช่วยให้เราสามารถดึงข้อมูลที่มีความสัมพันธ์ซับซ้อนออกมาในรูปแบบที่ Front-end สามารถนำไปใช้แสดงผลแบบ Sub-Table ขยายแถวได้อย่างมีประสิทธิภาพและรวดเร็วที่สุด ทำให้ระบบ Enterprise Application ของคุณมีประสิทธิภาพสูงและใช้งานง่ายในเวลาเดียวกัน

Exit mobile version