CodeGym /課程 /SQL SELF /JSON 與 JSONB 的操作

JSON 與 JSONB 的操作

SQL SELF
等級 33 , 課堂 0
開放

JSON 與 JSONB 的操作

有時候資料的結構根本不是單純的字串或數字。像是,一個使用者可能有一堆興趣、隨意的個人設定,或是訂單裡面有巢狀的參數。硬要為這些東西建一堆表格,超麻煩。這時候 JSON 就派上用場啦。

PostgreSQL 支援兩種格式來處理這種資料:JSONJSONB。兩個都能讓你在一個欄位裡存結構化資料,但它們之間還是有幾個很重要的差別。

我們來搞懂一下這兩個怎麼運作、什麼時候該用哪一個,還有它們能帶來什麼方便的功能。

什麼是 JSON

JSON(JavaScript Object Notation)是一種文字格式的資料交換方式,設計出來就是為了讓結構化資料好讀又好用。這格式對寫 web app 的工程師來說超熟悉,可以說是「人看得懂」又「電腦超好 parse」。在 PostgreSQL 裡,這格式就是拿來存跟處理結構化資料的。

來看個 JSON 物件的範例:

{
  "name": "Alex Lin",
  "age": 25,
  "skills": ["SQL", "PostgreSQL", "JavaScript"],
  "address": {
    "city": "Berlin",
    "postal_code": "10115"
  }
}

注意:JSON 就是純文字,但有規則。比如說,key 的名字一定要用引號包起來。

JSONB:Binary JSON

JSONB 就是「二進位 JSON」,PostgreSQL 也支援這個。跟 JSON 不一樣的是,JSONB 可以被索引,還有針對查詢跟修改做過優化。主要的差別在於它們在 PostgreSQL 裡的儲存方式:

  • JSON 就是照你給的資料原樣存成一條文字。
  • JSONB 會把資料轉成二進位格式,對大多數操作來說更有效率。

JSONB 給你這些好用的功能:可以做過濾、索引、比對複雜巢狀結構。

JSONB 的主要優點

為什麼要選 JSONB 而不是 JSON?這裡有幾個理由:

  1. 查詢跟過濾更快

JSONB 就是為了讓你能快快查資料。比如說你有一大堆物件,JSONB 可以讓你不用全部掃過一遍就找到你要的東西。

  1. 可以做索引

有了索引,你可以直接查 JSONB 裡面的 key 跟 value,查詢速度超快。純文字的 JSON 就沒辦法這樣做索引。

  1. 處理巢狀資料超方便

JSONB 處理巢狀結構超強。你不用為了階層資料搞一堆表格,全部都可以塞在一個欄位裡。

什麼時候該用 JSON,什麼時候該用 JSONB

  • JSON 適合你想把資料「原封不動」存成文字的時候。比如說你很在意資料的原始樣子,或是只要最簡單的處理。
  • JSONB 適合你常常要查、過濾、改資料,或是需要索引的時候。

JSON 物件範例

我們來看幾個 JSON 物件的例子,看看它們的結構有多彈性。

簡單的 JSON 物件。

key-value 結構:

{
  "name": "葉卡捷琳娜",
  "age": 29
}

JSON 裡的陣列

JSON 支援陣列:

{
  "skills": ["Python", "SQL", "Data Analysis"]
}

巢狀物件

JSON 可以組合出很複雜的資料:

{
  "name": "安德烈",
  "contacts": {
    "email": "andrey@example.com",
    "phone": "+79012345678"
  }
}

陣列跟物件混搭

你可以把陣列跟物件混在一起用:

{
  "team": [
    {
      "name": "葉蓮娜",
      "role": "經理"
    },
    {
      "name": "帕維爾",
      "role": "開發者"
    }
  ]
}

JSON 跟 PostgreSQL

PostgreSQL 有兩種專門處理 JSON 的資料型別:

  • JSON:文字格式。
  • JSONB:二進位格式。

建立有 JSON 跟 JSONB 欄位的資料表

來看看怎麼在 PostgreSQL 的表格裡用 JSON/JSONB。比如說,我們要建一個存公司員工資訊的表:

-- 建一個有 JSON 跟 JSONB 欄位的表
CREATE TABLE employees (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    details JSON,    -- 文字 JSON
    profile JSONB    -- 二進位 JSON
);

乍看之下,這兩個欄位好像沒差。但其實 JSON 很適合存原始資料,JSONB 則適合查詢跟過濾。

-- 插入資料
INSERT INTO employees (name, details, profile)
VALUES
('Alex Lin', '{"age": 30, "city": "Tallinn"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "football"}'),
('Maya Novak', '{"age": 25, "city": "Riga"}', '{"skills": ["Python", "Machine Learning"], "hobby": "reading"}');

查詢 JSONB 資料

你可以用一些特別的函數來查 JSONB,這些我們下堂課會細講。比如說,想知道員工的技能:

-- 查詢技能
SELECT name, profile->'skills' AS skills
FROM employees;

查詢結果:

name skills
Alex Lin ["SQL", "PostgreSQL"]
Maya Novak ["Python", "Machine Learning"]

JSON 在現實生活的應用

JSON(還有 JSONB)在實際應用裡超常見。舉幾個例子:

  1. API 跟微服務。JSON 是 RESTful API 的標準資料格式。PostgreSQL 直接支援存跟處理 JSON。
  2. 資料整合。如果你的資料庫要從不同系統收資料,用 JSONB 會方便很多。
  3. 管理複雜結構。像是問卷資料、使用者設定或公司 metadata,JSONB 都很適合拿來存。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION