ข้อมูล JSON ใน PostgreSQL: โลกใหม่ของการจัดการข้อมูลบน Postgres
Tags: postgres, json, restapi
Published: 2024-07-12 03:22:09

**เกรินนำ**

PostgreSQL ไม่เพียงแค่เป็นฐานข้อมูลที่มีความสามารถสูง แต่ยังมีฟีเจอร์สำหรับการจัดการข้อมูล JSON ที่ทรงพลังอีกด้วย วันนี้เราจะพาคุณสำรวจโลกของ JSON ใน PostgreSQL ที่จะทำให้การจัดการข้อมูลของคุณเป็นเรื่องง่ายและสนุกขึ้น!

**ว่าแต่ JSON คืออะไร?**
JSON (JavaScript Object Notation) เป็นรูปแบบข้อมูลที่ใช้สำหรับการแลกเปลี่ยนข้อมูลระหว่างระบบ มีโครงสร้างที่เข้าใจง่ายทั้งสำหรับมนุษย์และเครื่องคอมพิวเตอร์ ซึ่งมักถูกใช้อย่างแพร่หลายในเว็บแอปพลิเคชันและบริการ API ต่าง ๆ

**รูปแบบของ JSON**

***วัตถุ (Object)***
วัตถุใน JSON ประกอบด้วยคู่ชื่อ-ค่า (name-value pairs) โดยใช้เครื่องหมาย {} และเครื่องหมายจุลภาค , เพื่อคั่นคู่ชื่อ-ค่าแต่ละคู่:
```json
{
    "name": "Alice",
    "age": 25,
    "city": "Wonderland"
}
```

***อาร์เรย์ (Array)***

อาร์เรย์ใน JSON ประกอบด้วยรายการของค่าโดยใช้เครื่องหมาย [] และเครื่องหมายจุลภาค , เพื่อคั่นค่าต่าง ๆ:

```json
[
    "Apple",
    "Banana",
    "Cherry"
]
```
***ประเภทของค่าใน JSON***

- สตริง (String): ข้อความที่อยู่ในเครื่องหมายอัญประกาศคู่ ""
```json
"example": "Hello, World!"
```
- ตัวเลข (Number): ค่าตัวเลข

```json
"example": 123
```
- วัตถุ (Object): ชุดของคู่ชื่อ-ค่า
```json
"example": {"key": "value"}
```
- อาร์เรย์ (Array): รายการของค่า
```json
"example": ["item1", "item2"]
```
- บูลีน (Boolean): ค่าความจริง true หรือ false
```json
"example": true
```
- ค่าว่าง (Null): ค่าว่าง null
```json
"example": null
```
***ตัวอย่างที่ซับซ้อนขึ้น***
แสดง Array ของ user Object  ซึ่งObject user ประกอบด้วยชื่อ(name)และเมือง(city)เป็น String และอายุ(age) เป็น Number
```json
{
    "users": [
        {
            "name": "Alice",
            "age": 25,
            "city": "Wonderland"
        },
        {
            "name": "Bob",
            "age": 30,
            "city": "Builderland"
        }
    ],
    "isActive": true,
    "totalUsers": 2
}
```

**มาเริ่มจัดการข้อมูล JSON กัน**

***สรา้งตารางที่มี column เป็น JSON***
เริ่มต้นสร้างตารางขึ้นมาก่อน
```sql
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    data JSONB
);
```
สร้างตาราง users ที่มีคอลัมน์ data เป็น JSONB

***การแทรกข้อมูล JSON***
การแทรกข้อมูล JSON ก็ง่ายไม่แพ้กัน ลองดูตัวอย่างนี้:

```sql
INSERT INTO users (data) VALUES ('{"name": "Alice", "age": 30, "city": "Wonderland"}');
```
ง่ายเหมือนการใส่ข้อมูลลงในฐานข้อมูลแบบธรรมดา!

***การค้นหาข้อมูล JSON***
การค้นหาข้อมูล JSON ใน PostgreSQL นั้นเหมือนการค้นหาในโลกแห่งมายา คุณสามารถใช้คำสั่งนี้:

```sql
Copy code
SELECT data->>'name' AS name FROM users WHERE data->>'city' = 'Wonderland';
```
คำสั่งนี้จะค้นหาผู้ใช้ที่อาศัยอยู่ในเมือง Wonderland และแสดงชื่อของพวกเขา

***การอัปเดตข้อมูล JSON***
การอัปเดตข้อมูล JSON ก็ทำได้ง่ายและรวดเร็ว ลองดูตัวอย่างนี้:

```sql
UPDATE users SET data = jsonb_set(data, '{age}', '31') WHERE data->>'name' = 'Alice';
```
เพียงเท่านี้ อายุของ Alice ก็จะถูกอัปเดตเป็น 31 ปี!

***การลบข้อมูล JSON***
การลบข้อมูล JSON ทำได้โดยการระบุคีย์ที่ต้องการลบ:
```sql
Copy code
UPDATE users SET data = data - 'city' WHERE data->>'name' = 'Alice';
```
คำสั่งนี้จะลบข้อมูลเมืองของ Alice ออกไป

**ฟังก์ชั่น และตัวดำเนินการเกี่ยวกับข้อมูล JSON**
จากการหัวข้อที่ผ่านมาจะพบว่า syntax หลายส่วนจะไม่ตรงตามรูปแบบภาษา SQL นักเนื่องจากประเภทข้อมูล JSON ไม่ใช่ชนิดข้อมูลมาตรฐานของ SQL แต่ Postgres ก็มีเครื่องมือที่ทรงพลังในการจัดการข้อมูลอยู่
***ตัวดำเนินการในการดึงข้อมูล
1. -> (Extract JSON Object Field): ดึงค่า JSON object field โดยไม่แปลงเป็นประเภทอื่น
2. ->> (Extract JSON Object Field as Text): ดึงค่า JSON object field และแปลงเป็นข้อความ
3. #> (Extract JSON Sub-Object): ดึงค่า JSON sub-object
4. #>> (Extract JSON Sub-Object as Text): ดึงค่า JSON sub-object และแปลงเป็นข้อความ
***ฟังก์ชันสำหรับการอัปเดตข้อมูล JSON***
1. jsonb_set: อัปเดตค่าใน JSONB
2. jsonb_insert: แทรกค่าใหม่ใน JSONB
3. jsonb_delete: ลบคีย์ออกจาก JSONB
***ฟังก์ชันสำหรับการสร้างและการตรวจสอบ JSON***
1. json_build_object: สร้าง JSON object จากคู่คีย์-ค่า
2. jsonb_pretty: จัดรูปแบบ JSONB ให้สวยงาม
3. jsonb_typeof: ตรวจสอบประเภทของค่าใน JSONB

> **<u>หมายเหตุ</u>**
> สามารถดูรายละเอียดเพิ่มเติม
https://www.postgresql.org/docs/current/functions-json.html

**ข้อควรรู้**
>**- JSON กับ JSONB ไม่เหมือนกันนะ** JSON กับจะเก็บข้อมูลในรูปแบบ text ในขณะที่ JSONB จะเก็บในรูปแบบ binary ทำให้รองรับการบีบอัดเพื่อประหยัดพื้นที่ และการเข้าข้อมูลแบบสุ่มทำให้เร็วกว่าจึงเหมาะสำหรับการเก็บข้อมูล JSON ที่ต้องการดัดแปลงบ่อย
>**- การทำ Index ในข้อมูลชนิด JSON** แนะนำดัชนีเป็นประเภท B-Tree ซึ่งทำงานได้ดีกว่า
>**- ขนาดข้อมูลสูงสุดที่รับได้** ใน postgres กำหนดค่าเริ่มต้นขนาดเพจไว้ 8KB และกำหนดประเภทข้อมูล  JSON ไว้ 1 เพจดังนั้นขนาดข้อมูลจึงไม่ควรเกิน 8 KB

**ส่งท้าย**
หวังว่าบนความนี้จะทำให้เข้าใจข้อมูลประเภท JSON และสนุกกับการจัดการข้อมูลประเภทนี้ผ่าน postgres มากขึ้นเพื่อนำมาใช้ในproject ต่างๆได้ครับแล้วพบกันใหม่ครับ