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 占用更多的磁盘空间,因为它留下了更多的足迹。
- 在某些情况下,聚合函数会减慢进程。