ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ การจัดการเอกสาร PDF เป็นฟังก์ชันที่สำคัญอย่างยิ่งยวด แต่การจัดเก็บไฟล์ PDF ขนาดใหญ่โดยตรงในฐานข้อมูลอาจส่งผลให้เกิดปัญหาด้านประสิทธิภาพ (Performance Overhead) และการจัดการข้อมูลที่ซับซ้อน
นี่คือจุดที่แนวคิดของ Virtual PDF Backend เข้ามามีบทบาท แนวคิดนี้ไม่ได้หมายถึงการเก็บไฟล์ PDF จริง ๆ แต่หมายถึงการสร้างระบบที่ใช้พลังของฐานข้อมูลเชิงสัมพันธ์อย่าง PostgreSQL ในการจัดการและสร้างโครงสร้างข้อมูล (Data Payload) ที่พร้อมสำหรับการแปลงเป็น PDF ในขั้นตอนสุดท้าย (On-the-fly Generation) โดยที่ข้อมูลต้นทางยังคงอยู่ในรูปแบบที่ Query ได้อย่างมีประสิทธิภาพ
💡 Virtual PDF Backend คืออะไรในมุมมองของ PostgreSQL?
ในฐานะ Senior Architect เรามองว่า Virtual PDF Backend คือการใช้คุณสมบัติขั้นสูงของ PostgreSQL เช่น JSONB, Common Table Expressions (CTEs), และ Stored Procedures เพื่อรวมข้อมูลจากหลายแหล่ง (Multi-source Data Aggregation) และจัดรูปแบบข้อมูลให้อยู่ในโครงสร้างแบบลำดับชั้น (Hierarchical Structure) ที่เป็นมาตรฐานสำหรับการส่งต่อให้ Microservice หรือ Library ภายนอก (เช่น wkhtmltopdf หรือ Puppeteer) ทำการ Render เป็น PDF
⚙️ หลักการทำงานเชิงสถาปัตยกรรม (Architectural Flow)
แทนที่จะ Query เพื่อดึงไฟล์ไบนารี (BLOB) เราจะ Query เพื่อดึงข้อมูลดิบที่ผ่านการประมวลผลแล้ว (Processed Data Payload) โดยใช้ PostgreSQL เป็นศูนย์กลางในการคำนวณและจัดโครงสร้างข้อมูลเหล่านั้น
- Data Layer (PostgreSQL): จัดเก็บข้อมูลดิบ (เช่น รายการสินค้า, ข้อมูลผู้ใช้)
- Processing Layer (SQL/PL/pgSQL): ใช้ฟังก์ชันและ Query เพื่อรวมข้อมูลและจัดโครงสร้างเป็น JSONB ที่สมบูรณ์
- Presentation Layer (External Service): รับ JSONB Payload จาก PostgreSQL และทำการแปลงเป็น PDF
💻 ตัวอย่างการสร้าง Payload ด้วย PostgreSQL
สมมติว่าเราต้องการสร้าง PDF รายงานที่ต้องรวมข้อมูลจากตาราง `orders` และ `products` เราสามารถใช้ JSONB เพื่อรวมข้อมูลเหล่านี้ให้เป็น Payload ที่พร้อมใช้งาน:
SQL
-- 1. สร้างตารางจำลองข้อมูล (Simulation Tables)
CREATE TABLE products (product_id INT, name VARCHAR, price NUMERIC);
INSERT INTO products VALUES (1, 'apple', 1.00);
INSERT INTO products VALUES (2, 'banana', 0.50);
CREATE TABLE orders (order_id INT, product_ids TEXT, quantity INT);
INSERT INTO orders VALUES (101, '1,2', 2);
-- 2. Query เพื่อรวมข้อมูลและสร้าง JSONB Payload
SELECT
o.order_id,
jsonb_build_object(
'products', (SELECT jsonb_agg(jsonb_build_object('id', p.product_id, 'name', p.name, 'price', p.price)) FROM products p WHERE p.product_id = ANY(string_to_array(o.product_ids, ','))),
'total_quantity', o.quantity
) AS pdf_payload
FROM orders o;
ผลลัพธ์ที่ได้คือ JSONB object ที่สมบูรณ์ ซึ่งเป็นข้อมูลที่พร้อมส่งต่อให้ระบบภายนอกเพื่อสร้าง PDF โดยไม่ต้องมีการ Join หรือคำนวณที่ซับซ้อนในระดับ Application Code
✅ ข้อดีของการใช้ PostgreSQL เป็น Virtual Backend
- ประสิทธิภาพ: การคำนวณโครงสร้างข้อมูลทั้งหมดในระดับฐานข้อมูลช่วยลดภาระของ Application Server
- ความสม่ำเสมอของข้อมูล: ข้อมูลถูกตรวจสอบความถูกต้องและจัดรูปแบบในระดับฐานข้อมูลก่อนส่งออก
- ความยืดหยุ่น: รองรับการเปลี่ยนแปลงของโครงสร้างรายงานได้ง่ายผ่านการปรับ Query
✨ บทสรุป
การใช้ PostgreSQL ในรูปแบบ Virtual PDF Backend เป็นสถาปัตยกรรมที่ทรงพลังและมีประสิทธิภาพสูง มันช่วยให้เราแยกความรับผิดชอบ (Separation of Concerns) ระหว่างการจัดเก็บข้อมูล (Data Storage) และการนำเสนอข้อมูล (Data Presentation) ทำให้ระบบมีความยืดหยุ่น ปรับขนาดได้ง่าย และรักษาประสิทธิภาพสูงสุดในการจัดการเอกสารที่ซับซ้อน