0Pricing
SQL Academy · 课时

JSONB 与 JSON:如何选择

根据存储需求,在 JSON(文本格式,可保留空白)与 JSONB(二进制格式、支持索引、键去重)之间做出选择

JSONB 与 JSON:如何选择 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

PostgreSQL 中的两种 JSON 类型

  • JSON——存储您写入的确切文本
  • JSONB——分解后的二进制格式,键会去重,并且支持建立索引

JSON:文本存储

JSON 会保留空白、键顺序和重复键。每次读取时都要重新解析。不支持 GIN 索引。对于新代码来说,几乎从来都不是正确选择。

INSERT INTO docs (data) VALUES ('{"a": 1, "a": 2}'::JSON);
SELECT data->'a' FROM docs;     -- whatever the parser picks

JSONB:二进制且支持索引

JSONB:

  • 以分解形式存储 → 读取时无需重新解析
  • 重复键会合并(后出现的值优先)
  • 不保留键顺序
  • 支持 GIN 索引
  • 支持丰富的路径运算符

JSONB 示例

一个简单的事件表:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  data JSONB NOT NULL
);

INSERT INTO events (data) VALUES
  ('{"type":"login","user_id":42,"ip":"1.2.3.4"}');

路径运算符

JSONB 提供丰富的运算符(下一课会介绍):

SELECT data->'user_id'   FROM events;       -- → JSONB
SELECT data->>'user_id'  FROM events;       -- → TEXT
SELECT data #>> '{user,name}' FROM events;  -- nested text path

包含关系

最有用的 JSONB 运算符:@>(包含)。

SELECT * FROM events WHERE data @> '{"type":"login"}';

-- Combined with a GIN index, this is fast even on billions of rows.

JSONB 的相等性

如果两个 JSONB 值的内容匹配,它们就相等——键的顺序无关紧要:

SELECT '{"a":1,"b":2}'::JSONB = '{"b":2,"a":1}'::JSONB;    -- TRUE

在类型之间进行转换

可以自由转换:

SELECT '{"a":1}'::JSONB->'a';                -- 1 (as JSONB)
SELECT ('{"a":1}'::JSONB)->>'a';             -- '1' (as TEXT)
SELECT ('{"a":1}'::JSONB)->'a'::INT;          -- 1 (as INT after extraction)

何时不应使用 JSONB

如果数据具有固定结构,请使用真正的列:

  • 查询更快(无需逐行解析文档)
  • 具有强类型和约束
  • 存储空间更小
  • 统计信息更好

当结构变化或快速演进时,JSONB 才能发挥优势。

混合建模

最佳实践:稳定字段使用结构化列,可变的额外字段使用 JSONB:

CREATE TABLE events (
  id BIGSERIAL PRIMARY KEY,
  ts TIMESTAMPTZ NOT NULL,
  event_type TEXT NOT NULL,
  user_id BIGINT,
  extra JSONB NOT NULL DEFAULT '{}'::JSONB
);

验证

JSONB 可以存储任何有效的 JSON。对于结构化约束,请使用 CHECK 约束,或在应用层执行模式约束:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type');

总结

对于几乎所有生产环境场景,JSONB 都优于 JSON。

  • JSONB:二进制格式、支持索引、路径操作快速
  • JSON:仅用于文本往返
  • 可变结构使用 JSONB;固定结构使用真正的列

快速检查

您正在设计一张新表,用于存储需要按内容查询的用户上传 JSON 文档。应该选择 JSON 还是 JSONB?

常见问题解答

「JSONB 与 JSON:如何选择」课时是免费的吗?

是的 — 「JSONB 与 JSON:如何选择」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「JSONB 与 JSON:如何选择」这节课中我会学到什么?

根据存储需求,在 JSON(文本格式,可保留空白)与 JSONB(二进制格式、支持索引、键去重)之间做出选择 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「JSONB 与 JSON:如何选择」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. JSONB 与 JSON:如何选择
  2. 路径操作符:-> ->> @>
  3. 使用 GIN 为 JSONB 建立索引
  4. 建模:何时 JSONB 优于规范化
← 返回 SQL Academy