有时候,数据结构根本不是那种传统的字符串和数字。比如说,一个用户可能有一堆爱好、随意的个人设置,或者订单里嵌套的参数。为这些东西专门建表,真的很麻烦。这时候 JSON 就能帮大忙了。
PostgreSQL 支持两种格式来搞定这种数据:JSON 和 JSONB。它们都能把结构化数据塞进一列里,但其实区别还挺大的。
咱们来搞清楚它们怎么用,啥时候用哪个,以及它们能带来哪些骚操作。
啥是 JSON
JSON(JavaScript Object Notation)就是一种文本格式的数据交换方式,专门为结构化数据设计的。搞 Web 的同学肯定都见过它,可以说是“人类能看懂,电脑也能轻松解析”。在 PostgreSQL 里,这个格式就是用来存和处理结构化数据的。
来个 JSON 对象的例子:
{
"name": "Alex Lin",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JavaScript"],
"address": {
"city": "Berlin",
"postal_code": "10115"
}
}
注意:JSON 就是文本,但有规则。比如,key 的名字必须用引号包起来。
JSONB:二进制 JSON
JSONB 就是“二进制 JSON”,PostgreSQL 也支持。和 JSON 不一样,JSONB 能被索引,还专门为快速查询和修改做了优化。它们的最大区别就是存储方式:
- 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", "数据分析"]
}
嵌套对象
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": "塔林"}', '{"skills": ["SQL", "PostgreSQL"], "hobby": "足球"}'),
('Maya Novak', '{"age": 25, "city": "里加"}', '{"skills": ["Python", "机器学习"], "hobby": "阅读"}');
提取 JSONB 数据
你可以用专门的函数从 JSONB 里提取数据,这个我们下节课会详细讲。比如,想知道员工的技能:
-- 提取技能
SELECT name, profile->'skills' AS skills
FROM employees;
结果:
| name | skills |
|---|---|
| Alex Lin | ["SQL", "PostgreSQL"] |
| Maya Novak | ["Python", "机器学习"] |
JSON 的实际应用
JSON(还有 JSONB)在实际项目里用得超多。举几个例子:
- API 和微服务。JSON 是 RESTful API 的标准数据格式。PostgreSQL 原生支持存和处理它。
- 数据集成。如果你的数据库要从各种系统收数据,用 JSONB 会更顺手。
- 管理复杂结构。比如,JSONB 很适合存问卷、用户设置或者企业元数据。
GO TO FULL VERSION