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 picksJSONB:二进制且支持索引
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 反馈 — 无需本地设置。
此课程中的所有课时
- JSONB 与 JSON:如何选择
- 路径操作符:-> ->> @>
- 使用 GIN 为 JSONB 建立索引
- 建模:何时 JSONB 优于规范化