ป้ายกำกับ: Cte

jQuery plus.RepeaterjQuery plus.Repeater

ในโลกของการพัฒนาแอปพลิเคชันสมัยใหม่ การจัดการกับข้อมูลที่มีโครงสร้างซ้ำๆ (Repeating Structures) หรือความสัมพันธ์แบบหนึ่งต่อหลาย (One-to-Many Relationships) ถือเป็นโจทย์ที่ท้าทายเสมอ ไม่ว่าจะเป็นการสร้างฟอร์มที่มีแถวรายการสินค้าหลายรายการ หรือการจัดเก็บข้อมูลย่อยที่เกี่ยวข้องกับหลักฐานข้อมูลหลัก

เดิมที เครื่องมืออย่าง jQuery plus.Repeater ถูกออกแบบมาเพื่อช่วยให้การสร้างฟอร์มแบบไดนามิกบนฝั่ง Client-side เป็นเรื่องง่าย แต่ในมุมมองของ Senior Architect ที่ต้องรับผิดชอบความสมบูรณ์และความถูกต้องของข้อมูล (Data Integrity) การจัดการโครงสร้างซ้ำๆ ควรถูกย้ายไปประมวลผลที่ Server-side ซึ่งก็คือฐานข้อมูล PostgreSQL นั่นเอง

💡 แนวคิดหลัก: การจำลอง Repeater ในระดับ Database

แทนที่จะพึ่งพา JavaScript เพื่อสร้างแถว input ซ้ำๆ เราจะใช้ความสามารถอันทรงพลังของ PostgreSQL ในการจัดการโครงสร้างข้อมูลที่ซับซ้อน โดยเฉพาะการใช้ประเภทข้อมูล JSONB และเทคนิค Common Table Expressions (CTEs) อย่าง WITH RECURSIVE เพื่อจำลองการทำงานของการทำซ้ำและการจัดกลุ่มข้อมูล

🎯 องค์ประกอบสำคัญที่ต้องรู้

  1. JSONB Data Type: เป็นหัวใจสำคัญในการเก็บข้อมูลที่มีโครงสร้างยืดหยุ่น (Schema-less) เช่น รายการสินค้าหลายรายการในใบสั่งซื้อเดียว โดยยังคงสามารถ Query ได้อย่างมีประสิทธิภาพสูง
  2. Common Table Expressions (CTE): ใช้เพื่อกำหนดชุดข้อมูลชั่วคราวที่ซับซ้อน ทำให้เราสามารถจำลองการวนซ้ำหรือการสร้างลำดับของข้อมูลได้โดยไม่จำเป็นต้องใช้โค้ดที่ยุ่งยาก

🛠️ ตัวอย่างการใช้งาน: การจัดการรายการสินค้าในใบสั่งซื้อ

สมมติว่าเราต้องการบันทึกใบสั่งซื้อ (Order) ซึ่งประกอบด้วยข้อมูลหลักเพียงครั้งเดียว แต่มีรายการสินค้า (Line Items) ได้หลายรายการ นี่คือตัวอย่างการใช้ PostgreSQL เพื่อจำลองการทำซ้ำของข้อมูล:

SQL

-- 1. สร้างตารางหลักสำหรับใบสั่งซื้อ (Order Header) และตารางสำหรับรายการสินค้า (Line Item) ที่เป็นความสัมพันธ์แบบ 1:N
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT NOT NULL,
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE line_items (
    item_id SERIAL PRIMARY KEY,
    order_id INT REFERENCES orders(order_id),
    product_sku VARCHAR(50) NOT NULL,
    quantity INT NOT NULL,
    price NUMERIC(10, 2) NOT NULL
);

-- 2. การแทรกข้อมูลแบบกลุ่ม (Simulating Repeater Functionality)
-- เราจะบันทึก Order Header ก่อน
INSERT INTO orders (customer_id) VALUES (101) RETURNING order_id;

-- สมมติว่าได้ order_id = 1
-- จากนั้นเราแทรกรายการสินค้าหลายรายการที่เกี่ยวข้องกับ Order ID นี้
INSERT INTO line_items (order_id, product_sku, quantity, price)
VALUES
(1, 'SKU-A001', 2, 150.00),
(1, 'SKU-B005', 1, 499.99);

-- 3. การดึงข้อมูลที่รวมโครงสร้างซ้ำ (Joining the Grouped Data)
SELECT
    o.order_id,
    o.order_date,
    jsonb_agg(jsonb_build_object('sku', li.product_sku, 'qty', li.quantity, 'price', li.price)) AS line_items_details
FROM orders o
JOIN line_items li ON o.order_id = li.order_id
GROUP BY o.order_id, o.order_date;

✨ การวิเคราะห์โค้ด (Architect’s View)

การใช้ jsonb_agg() ในตัวอย่างนี้คือการจำลองฟังก์ชัน Repeater ที่สมบูรณ์แบบที่สุดในระดับ Database มันไม่ได้แค่สร้างแถวข้อมูลซ้ำๆ แต่ยังรวมโครงสร้างเหล่านั้นให้อยู่ในรูปแบบ JSONB ภายใต้คอลัมน์เดียว ทำให้แอปพลิเคชันที่ดึงข้อมูลไปใช้งานสามารถประมวลผลรายการสินค้าทั้งหมดได้อย่างง่ายดายด้วยการวนลูปเพียงครั้งเดียว

✅ บทสรุป: การยกระดับสถาปัตยกรรมข้อมูล

การเข้าใจว่าระบบ Repeater ไม่ได้จำกัดอยู่แค่ใน JavaScript แต่สามารถถูกออกแบบให้เป็นส่วนหนึ่งของ Logic ในระดับ Database ได้นั้น เป็นกุญแจสำคัญในการเป็น Senior Architect ที่แท้จริง การใช้ PostgreSQL ร่วมกับ JSONB และ CTEs ช่วยให้เราสร้างแอปพลิเคชันที่มีประสิทธิภาพสูง มีความน่าเชื่อถือของข้อมูล (Data Integrity) สูงกว่า และลดภาระการประมวลผลที่ต้องแบกรับโดย Client-side JavaScript อย่างมาก