PostgreSQL ถือเป็นหนึ่งใน Relational Database ที่ทรงพลังมากที่สุด เพราะนอกจากจะรองรับโครงสร้างตารางแบบปกติแล้ว ยังสามารถเก็บข้อมูลในรูปแบบ JSON และ JSONB เพื่อรองรับข้อมูลกึ่งโครงสร้าง (Semi-structured Data) ได้อีกด้วย บทความนี้จะอธิบายความแตกต่างของ JSON vs JSONB และการ Query ด้วย Operator เช่น ->
, ->>
, #>
JSON และ JSONB คืออะไร?
- JSON → เก็บข้อมูลในรูปแบบข้อความ (Text)
- JSONB → เก็บข้อมูลในรูปแบบ Binary (ประสิทธิภาพดีกว่า, ใช้ Index ได้)
โดยทั่วไป แนะนำให้ใช้ JSONB หากต้องการ Query ข้อมูลบ่อย ส่วน JSON เหมาะสำหรับเก็บ Raw Data ที่ไม่ค่อยถูก Query
การสร้างตารางที่เก็บ JSON/JSONB
CREATE TABLE users ( id SERIAL PRIMARY KEY, profile JSONB );
INSERT INTO users (profile) VALUES ('{"name": "Alice", "age": 25, "address": {"city": "Bangkok", "zip": "10110"}}'), ('{"name": "Bob", "age": 30, "address": {"city": "Chiang Mai", "zip": "50000"}}');

การ Query JSON ด้วย Operators
1. Operator ->
ใช้ดึงค่า JSON Object หรือ JSON Array แต่ผลลัพธ์ยังเป็น JSON
SELECT profile -> 'name' AS name FROM users;
2. Operator ->>
ใช้ดึงค่าออกมาเป็น Text (Scalar)
SELECT profile ->> 'name' AS name_text FROM users;
3. Operator #>
ใช้ดึงค่าจาก Path ภายใน JSON Object
SELECT profile #> '{address,city}' AS city FROM users;
ผลลัพธ์จะคืนค่า JSON ที่อยู่ใน path address.city
การใช้ Index บน JSONB
PostgreSQL รองรับการสร้าง Index บน JSONB โดยเฉพาะ GIN Index เพื่อให้การค้นหาข้อมูลเร็วขึ้น
CREATE INDEX idx_users_profile ON users USING GIN (profile);
การ Query ด้วยเงื่อนไข JSON
SELECT * FROM users WHERE profile ->> 'name' = 'Alice';
SELECT * FROM users WHERE profile #> '{address,city}' = '"Bangkok"';
การอัปเดตข้อมูล JSONB
PostgreSQL มีฟังก์ชัน jsonb_set
สำหรับแก้ไขข้อมูลภายใน JSONB
UPDATE users SET profile = jsonb_set(profile, '{address,city}', '"Phuket"') WHERE profile ->> 'name' = 'Alice';
ข้อดีของ JSON/JSONB
- ยืดหยุ่นในการเก็บข้อมูลกึ่งโครงสร้าง
- รองรับการ Query ด้วย Operator และ Function
- รองรับการสร้าง Index เพื่อเพิ่มประสิทธิภาพ
ข้อเสียของ JSON/JSONB
- การ Query ข้อมูลซับซ้อนอาจช้ากว่าตารางปกติ
- ไม่เหมาะกับการเก็บข้อมูลที่ต้องการโครงสร้างตายตัว
- อาจใช้พื้นที่จัดเก็บมากขึ้น (โดยเฉพาะ JSON)
Best Practices
- ใช้ JSONB แทน JSON หากต้อง Query บ่อย
- สร้าง GIN Index บน JSONB เพื่อเพิ่มประสิทธิภาพ
- ใช้ Path Operator (#>) สำหรับ Query ข้อมูลลึก
- ใช้ jsonb_set สำหรับการอัปเดตเฉพาะส่วน
สรุป
การเก็บข้อมูลในรูปแบบ JSON/JSONB ใน PostgreSQL เป็นฟีเจอร์ที่ทำให้ฐานข้อมูลมีความยืดหยุ่นสูง โดยเฉพาะการ Query ด้วย Operator ->
, ->>
, #>
ช่วยให้จัดการข้อมูลกึ่งโครงสร้างได้ง่ายและมีประสิทธิภาพ การใช้ JSONB ร่วมกับ GIN Index จะทำให้ระบบทำงานได้รวดเร็วขึ้นอย่างมาก
SEO Keywords
PostgreSQL JSON,PostgreSQL JSONB,PostgreSQL JSON Query,JSON Operator PostgreSQL,Postgres -> ->> #>,JSONB GIN Index,การเก็บ JSON PostgreSQL