CodeGym /课程 /SQL SELF /使用数据类型 JSONB

使用数据类型 JSONB

SQL SELF
第 16 级 , 课程 1
可用

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用太多会让索引和数据库管理变麻烦。如果数据结构很稳定,还是用关系型表更好。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION