Skip to main content

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 แต่ก็มีความแตกต่างที่สำคัญ:

คุณสมบัติJSONJSONB
การเก็บข้อมูลเก็บในรูปแบบข้อความเก็บในรูปแบบไบนารี
ความเร็วในการค้นหาช้ากว่าในการค้นหาข้อมูลเร็วกว่าในการค้นหาข้อมูล
การจัดดัชนีไม่รองรับการจัดดัชนีรองรับการจัดดัชนี (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: ใช้เพื่ออัพเดตค่าภายใน JSONB
  • jsonb_array_elements: ใช้เพื่อแปลง JSONB array เป็นแถว
  • jsonb_each: ใช้เพื่อแยกคู่ key-value ของ JSONB
  • jsonb_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 และการเลือกใช้ประเภทข้อมูลที่เหมาะสมจะช่วยเพิ่มประสิทธิภาพในการทำงานกับฐานข้อมูล