JSON และ JSONB ใน PostgreSQL
บทนำ
ใน PostgreSQL, JSON และ JSONB เป็นประเภทข้อมูลที่ใช้สำหรับเก็บข้อมูลในรูปแบบของ JSON (JavaScript Object Notation) ซึ่งเป็นรูปแบบการจัดเก็บข้อมูลที่สามารถใช้งานได้ง่ายและเป็นที่นิยมในหลายๆ ระบบฐานข้อมูลและแอปพลิเคชัน. PostgreSQL รองรับทั้งสองประเภทข้อมูลนี้, ซึ่งทั้งสองมีคุณสมบัติที่แตกต่างกันเล็กน้อยที่ทำให้เหมาะกับการใช้งานในกรณีที่ต่างกัน
- JSON: เก็บข้อมูลในรูปแบบข้อความ JSON
- JSONB: เก็บข้อมูลในรูปแบบไบนารีของ JSON ที่สามารถจัดการได้เร็วขึ้นและมีคุณสมบัติเพิ่มเติม
1. การใช้ JSON ใน PostgreSQL
JSON เป็นประเภทข้อมูลที่เก็บข้อมูลในรูปแบบข้อความ JSON ซึ่งสามารถเก็บข้อมูลที่มีโครงสร้างซับซ้อนได้ เช่น วัตถุ (objects) และอาร์เรย์ (arrays) การใช้ JSON จะเก็บข้อมูลในลักษณะที่เหมือนกับการเขียนข้อความ JSON ทั่วไป
การสร้างตารางที่มีคอลัมน์ประเภท JSON:
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT,
details JSON
);
การแทรกข้อมูลในคอลัมน์ JSON:
INSERT INTO products (name, details)
VALUES
('Smartphone', '{"brand": "BrandX", "model": "X100", "price": 199.99}');
การดึงข้อมูลจากคอลัมน์ JSON:
การเข้าถึงข้อมูลภายใน JSON สามารถทำได้โดยใช้เครื่องหมาย -> หรือ ->>:
->: ดึงค่าของ key ใน JSON กลับมาเป็น JSON->>: ดึงค่าของ key ใน JSON กลับมาเป็นค่าข้อความ (text)
SELECT details->'brand' AS brand, details->>'model' AS model
FROM products;
ในตัวอย่างนี้, คำสั่ง details->'brand' จะดึงข้อมูลภายใน JSON ที่เก็บในคอลัมน์ details โดยจะได้ผลลัพธ์เป็น JSON ส่วน details->>'model' จะดึงข้อมูลในรูปแบบข้อความ
2. การใช้ JSONB ใน PostgreSQL
JSONB (JSON Binary) คือประเภทข้อมูลที่เก็บข้อมูลในรูปแบบไบนารีของ JSON ซึ่งแตกต่างจาก JSON ตรงที่ JSONB สามารถจัดเก็บข้อมูลได้อย่างมีประสิทธิภาพมากขึ้น โดยจะถูกทำให้เป็นรูปแบบไบนารีที่สามารถค้นหาข้อมูลได้เร็วขึ้นและรองรับดัชนี (indexing) สำหรับการค้นหาที่มีประสิทธิภาพ
การสร้างตารางที่มีคอลัมน์ประเภท JSONB:
CREATE TABLE products_b (
id SERIAL PRIMARY KEY,
name TEXT,
details JSONB
);
การแทรกข้อมูลในคอลัมน์ JSONB:
INSERT INTO products_b (name, details)
VALUES
('Smartphone', '{"brand": "BrandX", "model": "X100", "price": 199.99}');
การดึงข้อมูลจากคอลัมน์ JSONB:
การเข้าถึงข้อมูลใน JSONB จะเหมือนกับการใช้ใน JSON โดยสามารถใช้ -> และ ->> ได้
SELECT details->'brand' AS brand, details->>'model' AS model
FROM products_b;
3. ความแตกต่างระหว่าง JSON และ JSONB
แม้ว่า JSON และ JSONB จะมีความคล้ายคลึงกันในการจัดเก็บข้อมูลในรูปแบบ JSON แต่ก็มีความแตกต่างที่สำคัญ:
| คุณสมบัติ | JSON | JSONB |
|---|---|---|
| การเก็บข้อมูล | เก็บในรูปแบบข้อความ | เก็บในรูปแบบไบนารี |
| ความเร็วในการค้นหา | ช้ากว่าในการค้นหาข้อมูล | เร็วกว่าในการค้นหาข้อมูล |
| การจัดดัชนี | ไม่รองรับการจัดดัชนี | รองรับการจัดดัชนี (indexing) |
| ความยืดหยุ่นในการเก็บข้อมูล | มีความยืดหยุ่นสูงในการเก็บข้อมูล | รองรับการจัดเก็บข้อมูลได้ดีขึ้นแต่มีข้อจำกัดบางประการ |
| ขนาดของข้อมูล | ขนาดไฟล์จะใหญ่กว่า JSONB | ขนาดไฟล์จะเล็กกว่า JSON |
4. การใช้ดัชนี (Indexing) กับ JSONB
หนึ่งในข้อได้เปรียบของ JSONB คือการที่สามารถใช้ ดัชนี (index) เพื่อเพิ่มประสิทธิภาพในการค้นหาข้อมูลได้ โดย PostgreSQL รองรับการสร้างดัชนีที่ใช้กับคอลัมน์ประเภท JSONB
การสร้างดัชนีสำหรับ JSONB:
CREATE INDEX idx_jsonb_details
ON products_b USING gin (details);
การสร้างดัชนีนี้จะช่วยเพิ่มประสิทธิภาพในการค้นหาข้อมูลที่เก็บอยู่ใน JSONB โดยเฉพาะเมื่อมีการค้นหาหรือกรองข้อมูลที่อยู่ในคอลัมน์ JSONB
การค้นหาข้อมูลใน JSONB โดยใช้ดัชนี:
SELECT *
FROM products_b
WHERE details @> '{"brand": "BrandX"}';
ในตัวอย่างนี้, การใช้เครื่องหมาย @> จะทำการค้นหา JSONB ที่มี key-value ที่ตรงกับเงื่อนไขที่กำหนด โดยดัชนี GIN ที่สร้างไว้จะช่วยเพิ่มประสิทธิภาพในการค้นหานี้
5. ฟังก์ชันและตัวดำเนินการสำหรับ JSON/JSONB
PostgreSQL มีฟังก์ชันและตัวดำเนินการหลากหลายสำหรับการทำงานกับ JSON และ JSONB ซึ่งรวมถึง:
jsonb_set: ใช้เพื่ออัพเดตค่าภายใน JSONBjsonb_array_elements: ใช้เพื่อแปลง JSONB array เป็นแถวjsonb_each: ใช้เพื่อแยกคู่ key-value ของ JSONBjsonb_extract_path: ใช้เพื่อดึงข้อมูลจากเส้นทางใน JSONB
ตัวอย่างการใช้งาน:
SELECT jsonb_set(details, '{price}', '250.99')
FROM products_b
WHERE id = 1;
ในตัวอย่างนี้, jsonb_set ใช้ในการอัพเดตค่า price ในคอลัมน์ details ของ JSONB โดยจะเปลี่ยนค่าเป็น 250.99
6. ข้อดีของการใช้ JSON และ JSONB
ข้อดีของ JSON:
- การเก็บข้อมูลในรูปแบบข้อความที่สามารถเข้าถึงได้ง่ายและยืดหยุ่น
- เหมาะกับข้อมูลที่ไม่ต้องการการค้นหาที่เร็วหรือการใช้ดัชนี
ข้อดีของ JSONB:
- การจัดเก็บข้อมูลในรูปแบบไบนารีที่มีประสิทธิภาพ
- รองรับการค้นหาข้อมูลที่เร็วขึ้นและสามารถใช้ดัชนีในการค้นหาข้อมูลได้
- มีการจัดการข้อมูลที่มีโครงสร้างซับซ้อนดีกว่า JSON
7. สรุป
- JSON เป็นประเภทข้อมูลที่เก็บข้อมูลในรูปแบบข้อความ JSON ซึ่งเหมาะกับการเก็บข้อมูลที่ยืดหยุ่น
- JSONB เป็นประเภทข้อมูลที่เก็บข้อมูลในรูปแบบไบนารี JSON ที่มีประสิทธิภาพมากกว่าในการค้นหาข้อมูลและรองรับการจัดดัชนี
- การเลือกใช้ระหว่าง JSON และ JSONB ขึ้นอยู่กับความต้องการในการประมวลผลข้อมูล: ถ้าต้องการประสิทธิภาพสูงในการค้นหาข้อมูลและการใช้ดัชนี, JSONB คือตัวเลือกที่ดีกว่า
ทั้ง JSON และ JSONB เป็นเครื่องมือที่มีประโยชน์ในการจัดการกับข้อมูลที่มีโครงสร้างซับซ้อนใน PostgreSQL และการเลือกใช้ประเภทข้อมูลที่เหมาะสมจะช่วยเพิ่มประสิทธิภาพในการทำงานกับฐานข้อมูล