JSON (JavaScript Object Notation) —— 这是一个很流行的数据格式,用来在系统之间交换信息。它轻量、易读,非常适合表示结构化数据,比如对象或者数组。
PostgreSQL支持两种JSON相关的数据类型:
JSON:以字符串形式存储数据。就是纯文本的JSON,没有内部优化。JSONB:JSON的二进制表示。读取、过滤和处理都更高效,因为PostgreSQL会提前解析并优化存储。
为啥大家更喜欢用JSONB?因为:
- 二进制存储让查询更快。
- 可以被索引,超适合大数据集。
- 会自动排序key并去重,处理起来更方便。
JSON结构的例子:
{
"name": "Alice",
"age": 25,
"skills": ["SQL", "PostgreSQL", "JSONB"]
}
为啥 JSONB 很有用?
存储半结构化数据。 现实中,数据经常是复杂对象(比如元数据、设置、用户资料)。JSONB让你不用建一堆表和关系就能存这些东西。
建模经常变化的数据。 如果对象结构经常变(比如字段加减),JSONB可以很灵活地存这些数据。
和API打交道。 很多web应用都用JSON格式传数据。你可以直接存下来,不用转换,想怎么查就怎么查。
创建带有 JSONB 的表
来点实操!假设我们要建一个数据库,用来存用户资料。
profile字段会存所有额外信息(比如年龄、兴趣、联系方式),格式是JSON。这样每个用户的数据结构都可以不一样,非常灵活。
| id | name - VARCHAR(100) | profile - JSONB |
|---|---|---|
| 1 | Alice | {"age": 25, "skills": ["SQL", "PostgreSQL", "JSONB"], "location": "New York"} |
| 2 | Bob | {"age": 30, "interests": ["hiking", "photography"], "location": "Denver"} |
| 3 | Charlie | {"email": "charlie@example.com", "verified": true} |
| 4 | Diana | {"age": 22, "skills": ["Python"], "bio": "Data enthusiast", "location": "Berlin"} |
| 5 | Eve | {"age": 28, "skills": [], "preferences": {"theme": "dark", "notifications": false}} |
JSON数据可以直接当字符串插入。PostgreSQL会自动把它转成JSONB格式。
从 JSONB 里提取数据
现在有了数据,来看看怎么查。PostgreSQL有很多操作符可以玩转JSONB。
访问字段的值
用->操作符拿到字段的值:
-- 显示用户的年龄
SELECT profile->'age' AS age FROM users;
把值转成文本
->>操作符可以把值提取成字符串:
-- 显示用户的居住地
SELECT profile->>'location' AS location FROM users;
用 JSONB 过滤数据
JSONB的强大之处在于可以用SQL操作符直接查JSON。
按key过滤的例子:
-- 找到居住地是"New York"的用户
SELECT * FROM users
WHERE profile->>'location' = 'New York';
在数组里查找
JSON支持数组,PostgreSQL也能查数组里的值:
-- 找到会SQL的用户
SELECT * FROM users
WHERE 'SQL' = ANY(jsonb_array_elements_text(profile->'skills'));
函数jsonb_array_elements_text会把数组里的元素变成字符串,方便比较。
还有更短的写法,用@>操作符:
-- 找到会SQL的用户
SELECT * FROM users
WHERE profile->'skills' @> '["SQL"]';
更多JSON相关的函数和玩法,咱们后面再聊,等你学到那一步 :P
小结:啥时候用 JSONB
JSONB特别适合:
- 存储复杂结构化数据。
- 处理外部API的数据。
- 对象结构经常变的场景。
不过要注意,JSONB用太多会让索引和数据库管理变麻烦。如果数据结构很稳定,还是用关系型表更好。
GO TO FULL VERSION