JSON 與 JSONB 的操作
有時候資料的結構根本不是單純的字串或數字。像是,一個使用者可能有一堆興趣、隨意的個人設定,或是訂單裡面有巢狀的參數。硬要為這些東西建一堆表格,超麻煩。這時候 JSON 就派上用場啦。
PostgreSQL 支援兩種格式來處理這種資料:JSON 跟 JSONB。兩個都能讓你在一個欄位裡存結構化資料,但它們之間還是有幾個很重要的差別。
我們來搞懂一下這兩個怎麼運作、什麼時候該用哪一個,還有它們能帶來什麼方便的功能。
什麼是 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?這裡有幾個理由:
- 查詢跟過濾更快
JSONB 就是為了讓你能快快查資料。比如說你有一大堆物件,JSONB 可以讓你不用全部掃過一遍就找到你要的東西。
- 可以做索引
有了索引,你可以直接查 JSONB 裡面的 key 跟 value,查詢速度超快。純文字的 JSON 就沒辦法這樣做索引。
- 處理巢狀資料超方便
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)在實際應用裡超常見。舉幾個例子:
- API 跟微服務。JSON 是 RESTful API 的標準資料格式。PostgreSQL 直接支援存跟處理 JSON。
- 資料整合。如果你的資料庫要從不同系統收資料,用 JSONB 會方便很多。
- 管理複雜結構。像是問卷資料、使用者設定或公司 metadata,JSONB 都很適合拿來存。
GO TO FULL VERSION