ในโลกของการพัฒนาแอปพลิเคชันสมัยใหม่ การจัดการกับข้อมูลที่มีโครงสร้างซ้ำๆ (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 เพื่อจำลองการทำงานของการทำซ้ำและการจัดกลุ่มข้อมูล
🎯 องค์ประกอบสำคัญที่ต้องรู้
- JSONB Data Type: เป็นหัวใจสำคัญในการเก็บข้อมูลที่มีโครงสร้างยืดหยุ่น (Schema-less) เช่น รายการสินค้าหลายรายการในใบสั่งซื้อเดียว โดยยังคงสามารถ Query ได้อย่างมีประสิทธิภาพสูง
- 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 อย่างมาก