ป้ายกำกับ: Sql Optimization

จูบาโกะ (重箱) กล่องเป็นชั้นจูบาโกะ (重箱) กล่องเป็นชั้น

ในโลกของการพัฒนาซอฟต์แวร์ที่ต้องจัดการชุดข้อมูลที่มีความซับซ้อนและมีหลายระดับ (Layered Data) การดึงข้อมูลที่ถูกต้องและมีประสิทธิภาพจึงเป็นความท้าทายหลัก แนวคิดของ ‘จูบาโกะ’ (重箱) หรือกล่องที่จัดเก็บของเป็นชั้นๆ จึงถูกนำมาเปรียบเทียบกับการออกแบบ Query ที่ต้องผ่านกระบวนการกรองและแปลงข้อมูลหลายขั้นตอน

ในฐานะ System Specialist เราทราบดีว่าการเขียน SQL ที่มีโครงสร้างชัดเจนเป็นสิ่งสำคัญ และ PostgreSQL คือระบบจัดการฐานข้อมูลที่ทรงพลังที่สุดในการจัดการโครงสร้างข้อมูลแบบเป็นชั้นนี้ โดยเครื่องมือหลักที่เราจะใช้คือ Common Table Expressions (CTEs) หรือการใช้ไวยากรณ์ WITH

💡 PostgreSQL Data Layering ด้วย CTEs: หลักการทำงานของ ‘จูบาโกะ’

CTEs คือการสร้างชุดผลลัพธ์ชั่วคราว (Temporary Result Set) ที่สามารถอ้างอิงได้ภายใน Query เดียวกัน การทำงานของ CTEs จึงเลียนแบบกลไกของ ‘จูบาโกะ’ ได้อย่างสมบูรณ์แบบ โดยแต่ละ CTE จะทำหน้าที่เป็น ‘ชั้น’ หนึ่งของกล่อง:

  1. ชั้นที่ 1 (Initial Layer): ดึงข้อมูลดิบจากตารางหลัก (Base Table)
  2. ชั้นที่ 2 (Processing Layer): ใช้ CTE แรกกรองหรือคำนวณข้อมูลที่ได้จากชั้นที่ 1
  3. ชั้นที่ 3 (Final Layer): ใช้ CTE ที่ผ่านการประมวลผลแล้วมาทำการ Join หรือสรุปผลลัพธ์สุดท้าย

การใช้ CTEs ไม่เพียงแต่ช่วยให้ Query มีความอ่านง่าย (Readability) อย่างมากเท่านั้น แต่ยังช่วยให้เราสามารถแบ่งตรรกะการทำงานที่ซับซ้อนออกเป็นโมดูลย่อยๆ ที่จัดการได้ง่าย (Modularity) ซึ่งเป็นหลักการออกแบบสถาปัตยกรรมระดับ Senior Architect เลยทีเดียว

💻 ตัวอย่างการใช้งาน PostgreSQL CTEs

สมมติว่าเรามีข้อมูลการสั่งซื้อสินค้า (Orders) และต้องการหาค่าเฉลี่ยของยอดสั่งซื้อเฉพาะสินค้าที่อยู่ในหมวดหมู่ ‘Electronics’ เท่านั้น โดยต้องผ่านการกรองข้อมูลหลายขั้นตอน:

SQL

WITH filtered_orders AS ( -- ชั้นที่ 1: กรองเฉพาะรายการสินค้าที่เกี่ยวข้อง -- SELECT order_id, product_id, quantity, price FROM orders WHERE product_id IN ('101', '102');

processed_sales AS ( -- ชั้นที่ 2: คำนวณยอดรวมของแต่ละรายการ -- SELECT order_id, SUM(quantity * price) AS total_sale FROM filtered_orders GROUP BY order_id);

SELECT 
    order_id, 
    AVG(total_sale) AS average_sale_value 
FROM processed_sales 
GROUP BY order_id;

จากตัวอย่างข้างต้น filtered_orders ทำหน้าที่เป็นชั้นแรกในการจำกัดขอบเขตข้อมูล ส่วน processed_sales ทำหน้าที่เป็นชั้นที่สองในการคำนวณยอดรวม จากนั้น Query หลักจะใช้ผลลัพธ์จากชั้นที่สองมาคำนวณค่าเฉลี่ยสุดท้าย ทำให้โค้ดมีความชัดเจนและเป็นระบบอย่างยิ่ง

✅ สรุป: ประโยชน์ของ Data Layering ใน PostgreSQL

การใช้ CTEs ใน PostgreSQL เพื่อจำลองแนวคิด ‘จูบาโกะ’ ไม่เพียงแต่เป็นเทคนิคทางไวยากรณ์เท่านั้น แต่ยังเป็นแนวคิดเชิงสถาปัตยกรรมที่ช่วยให้โค้ดของเรามีประสิทธิภาพสูง (Maintainability) สามารถ Debug ได้ง่าย และที่สำคัญที่สุดคือทำให้ Query ที่ซับซ้อนที่สุดก็ยังคงอ่านได้ราวกับเอกสารที่ถูกจัดเรียงเป็นชั้นๆ อย่างเป็นระเบียบ