PostgreSQL 中的 JSONB
JSONB 是一種以分解的二進位制格式儲存的 JSON 資料。如果你關注 Google 趨勢或進行一些研究,你會發現 JSON 在開發領域變得越來越流行。
如今,NoSQL 預設可以儲存 JSON 資料。因為它使用起來很健壯,我們可以將巢狀物件放在另一個物件中;因此它變得越來越流行。
Postgres 允許使用者在 SQL 型別資料庫中建立 JSON 和 JSONB 資料型別。
在 PostgreSQL 中使用 JSONB 建立表
假設我們要為產品建立一個表。可以有各種型別的產品。
例如,其中一些可以以升為單位,一些以克為單位,或者一些以件為單位。此外,特定產品的某些型別的資料可能與其他產品不同。
在這種情況下,最好使用 JSON 或 JSONB 來儲存這些不熟悉的資料。下面給出了建立具有 JSONB 型別資料的表:
CREATE TABLE Products(
id SERIAL PRIMARY KEY,
seller TEXT NOT NULL,
data JSONb NOT NULL
);
在 PostgreSQL 中插入 JSONB 資料型別
之前,我們建立的表包含一個具有 JSONb
型別資料的列。現在,讓我們填充表格。
眾所周知,JSONB 以 key-value 格式儲存資料,與 Python 中的字典相同。讓我們用一些資料填充上表。
INSERT INTO Products(seller,data)
VALUES
('Jones Heard',
'{ "name": "Milk Shake",
"price": "10$",
"ingredients":
{ "Milk":
{ "amount":"250ml","calorie":"100 Kcl"},
"Coco Powder":
{ "amount":"50 gram", "calorie":"100 Kcl"}
}
}'
);
由於我們成功地將 JSONB 資料插入到表中,是時候檢視新增的資料了。從上面的 JSON 中,我們可以注意到我們有巢狀的物件。
在鍵 data
中,我們有 name
、price
和 ingredient
。在成分
中,我們有成分及其數量和卡路里值。
所以,它是一個巢狀物件。這裡的動機是我們不需要複雜的連線來獲得這樣的巢狀輸出。
SELECT id ,seller, jsonb_pretty(data) as Product_Details
FROM products;
輸出:
id | seller | product_details
----+-------------+----------------------------------
1 | Jones Heard | { +
| | "name": "Milk Shake", +
| | "price": "10$", +
| | "ingredients": { +
| | "Milk": { +
| | "amount": "250ml", +
| | "calorie": "100 Kcl"+
| | }, +
| | "Coco Powder": { +
| | "amount": "50 gram",+
| | "calorie": "100 Kcl"+
| | } +
| | } +
| | }
(1 row)
在命令中,我們使用了 jsonb_pretty()
函式。它使用必要的縮排格式化 JSON 物件。
否則整個 JSON 會出現在一行中,很難理解物件之間的關係。
PostgreSQL 中 JSONB 的優缺點
雖然 Postgres 中有 JSON 型別,但他們也引入了 JSONB 格式。正如我們所見,宣告和其他查詢與 JSON 非常相似。
以下是在 JSON 上使用 JSONB 的一些好處:
- 比 JSON 效率更高。
- 它允許更快的處理,因為它是分解的二進位制檔案。
- 支援索引,JSON 不支援。
此外,它也有一些缺點。以下是:
- 較慢的輸入。
- 它比 JSON 佔用更多的磁碟空間,因為它留下了更多的足跡。
- 在某些情況下,聚合函式會減慢程序。