ในโลกของการพัฒนาซอฟต์แวร์สมัยใหม่ ข้อมูลไม่ได้ถูกจำกัดอยู่แค่รูปแบบตาราง (Relational) เท่านั้น การจัดเก็บข้อมูลที่มีโครงสร้างยืดหยุ่นอย่าง JSON จึงเป็นสิ่งจำเป็นอย่างยิ่ง PostgreSQL ได้เข้ามาตอบโจทย์นี้ด้วยประเภทข้อมูล JSONB ซึ่งช่วยให้เราสามารถจัดเก็บและจัดการข้อมูลแบบ NoSQL ได้โดยใช้พลังของ SQL ทำให้การทำงานมีความยืดหยุ่นสูง
บทความนี้จะพาคุณไปเรียนรู้วิธีการสร้าง (Create) และจัดการโครงสร้าง JSON ทั้งรูปแบบ Object และ Array ภายในฐานข้อมูล PostgreSQL โดยไม่ต้องพึ่งพาภาษาโปรแกรมภายนอกอย่าง Java อีกต่อไป แต่ใช้ฟังก์ชัน SQL ที่ทรงพลังเท่านั้น
💡 ทำไมต้องใช้ JSONB ใน PostgreSQL?
ก่อนจะลงมือปฏิบัติ เราควรรู้ความแตกต่างระหว่าง JSON และ JSONB:
- JSON: เก็บข้อมูลเป็นข้อความ (Text) ที่มีรูปแบบ JSON ซึ่งการค้นหาหรือแก้ไขข้อมูลภายในทำได้ยากและช้ากว่า
- JSONB (Binary JSON): PostgreSQL จะจัดเก็บข้อมูลในรูปแบบไบนารี ทำให้สามารถ Index และ Query ข้อมูลภายในได้อย่างรวดเร็ว มีประสิทธิภาพสูงในการใช้งานจริง ดังนั้นจึงควรใช้
JSONBเสมอเมื่อต้องการทำงานกับโครงสร้าง JSON
🛠️ การสร้าง JSON Object (Object Structure)
หากคุณต้องการสร้างโครงสร้างข้อมูลที่เป็นคู่ Key-Value เช่น {"appId": "A1", "name": "Product X"} คุณสามารถใช้ฟังก์ชัน jsonb_build_object() ซึ่งเป็นวิธีที่ง่ายและมีประสิทธิภาพที่สุด
ตัวอย่างการสร้าง JSON Object
SQL
SQL
SQL
-- สร้าง Object ที่เก็บข้อมูลแอปพลิเคชันหนึ่งรายการ (Key: appVersion, Value: '1.0') </code>
SELECT jsonb_build_object(
'appId', 'A1',
'name', 'Product X',
'version', '1.0'
) AS product_json;
คำอธิบาย: ฟังก์ชันนี้จะรับคู่ Key และ Value หลายชุด แล้วรวมเป็น Object JSONB ที่สมบูรณ์ทันที
📚 การสร้าง JSON Array (Array Structure)
สำหรับการเก็บรายการข้อมูลที่เหมือนกันหลายๆ รายการ เช่น รายชื่อสินค้า หรือรายการผู้ใช้ คุณจะต้องใช้โครงสร้างแบบ Array ซึ่งเราจะใช้ฟังก์ชัน jsonb_build_array() ร่วมกับ jsonb_build_object() เพื่อให้ได้ผลลัพธ์ที่ถูกต้อง
ตัวอย่างการสร้าง JSON Array
SQL
SQL
SQL
-- สร้าง Object สำหรับสินค้าแต่ละชิ้นก่อน
WITH product_data AS (
SELECT jsonb_build_object('id', 'A1', 'name', 'Product X') AS item1,
jsonb_build_object('id', 'B2', 'name', 'Service Y') AS item2
)
-- จากนั้นใช้ jsonb_build_array() เพื่อรวม Object เหล่านั้นเป็น Array
SELECT jsonb_build_array(item1, item2) AS product_list
FROM product_data;
คำอธิบาย: ผลลัพธ์ที่ได้จะเป็นโครงสร้าง [{"id": "A1", ...}, {"id": "B2", ...}] ซึ่งเป็น Array ของ Objects
🔗 การรวมและจัดการ JSON (Combining and Merging)
ในสถานการณ์จริง คุณมักจะต้องนำ Object หรือ Array หลายส่วนมาประกอบกัน PostgreSQL อนุญาตให้ใช้ Operator || สำหรับการรวม Object และฟังก์ชัน jsonb_agg() สำหรับการรวบรวมแถวข้อมูลเป็น Array
ตัวอย่าง: การรวม JSON Objects
SQL
SQL
SQL
-- รวม object สองชิ้นเข้าด้วยกัน (Key ที่ซ้ำกันจะถูกเขียนทับ)
SELECT jsonb_build_object(
'user_id', 101,
'details', 'Active'
) || jsonb_build_object(
'last_login', NOW(),
'status', 'Online'
);
ตัวอย่าง: การรวบรวมข้อมูลเป็น JSON Array (Aggregation)
สมมติว่าคุณมีตาราง products และต้องการดึงรายการสินค้าทั้งหมดมาเป็น JSON Array ในแถวเดียว:
SQL
SQL
SQL
SELECT jsonb_agg(t) FROM (
SELECT jsonb_build_object('sku', product_id, 'price', price)
FROM products
) AS t;
✅ สรุปและข้อควรจำ
การใช้ JSONB ใน PostgreSQL ทำให้คุณสามารถจัดการข้อมูลที่มีโครงสร้างซับซ้อนได้อย่างมีประสิทธิภาพสูง การทำความเข้าใจฟังก์ชันหลักอย่าง jsonb_build_object(), jsonb_build_array() และ Operator || จะช่วยให้คุณเขียน Query ที่ทรงพลังและยืดหยุ่นเทียบเท่ากับการใช้ ORM หรือ Library ในภาษาโปรแกรมภายนอก