การเก็บข้อมูล JSON ด้วย JSON/JSONB และการ Query ด้วย ->, ->>, #>

Sharing is caring!

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

Leave a Reply

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *