ป้ายกำกับ: Virtual PDF

Virtual PDF BackendVirtual PDF Backend

ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ การจัดการเอกสาร 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 เป็นศูนย์กลางในการคำนวณและจัดโครงสร้างข้อมูลเหล่านั้น

  1. Data Layer (PostgreSQL): จัดเก็บข้อมูลดิบ (เช่น รายการสินค้า, ข้อมูลผู้ใช้)
  2. Processing Layer (SQL/PL/pgSQL): ใช้ฟังก์ชันและ Query เพื่อรวมข้อมูลและจัดโครงสร้างเป็น JSONB ที่สมบูรณ์
  3. 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) ทำให้ระบบมีความยืดหยุ่น ปรับขนาดได้ง่าย และรักษาประสิทธิภาพสูงสุดในการจัดการเอกสารที่ซับซ้อน