CodeGym /课程 /SQL SELF /JSON 和 JSONB 的使用

JSON 和 JSONB 的使用

SQL SELF
第 33 级 , 课程 0
可用

有时候,数据结构根本不是那种传统的字符串和数字。比如说,一个用户可能有一堆爱好、随意的个人设置,或者订单里嵌套的参数。为这些东西专门建表,真的很麻烦。这时候 JSON 就能帮大忙了。

PostgreSQL 支持两种格式来搞定这种数据:JSONJSONB。它们都能把结构化数据塞进一列里,但其实区别还挺大的。

咱们来搞清楚它们怎么用,啥时候用哪个,以及它们能带来哪些骚操作。

啥是 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?理由如下:

  1. 查询和过滤更快

JSONB 就是为快速查数据设计的。比如你有一大堆对象,JSONB 能帮你秒查到想要的元素,不用全表遍历。

  1. 可以索引

有了索引,你可以直接查 JSONB 里的 key 和 value,查询速度飞起。JSON 只是文本,没法索引。

  1. 嵌套数据用起来超方便

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)在实际项目里用得超多。举几个例子:

  1. API 和微服务。JSON 是 RESTful API 的标准数据格式。PostgreSQL 原生支持存和处理它。
  2. 数据集成。如果你的数据库要从各种系统收数据,用 JSONB 会更顺手。
  3. 管理复杂结构。比如,JSONB 很适合存问卷、用户设置或者企业元数据。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION