0Pricing
SQL Academy · 课时

建模:何时 JSONB 优于规范化

在 JSONB 列与独立表之间做出选择——灵活属性与严格模式之间的权衡

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

如何选择

对于您可能存储的每项数据:应该使用列还是 JSONB 键?答案会影响模式设计、查询性能和可维护性。

列何时更有优势

当数据满足以下条件时,请使用真正的列:

  • 已知且稳定
  • 经常使用索引进行查询
  • 通过 CHECK / FK 约束进行验证
  • 需要生成报告或参与连接

JSONB 何时更有优势

在以下情况下使用 JSONB:

  • 每行的结构不同(租户定义的字段、插件元数据)
  • 模式快速演进(避免迁移)
  • 通常进行整个文档的读写
  • 存储不透明的负载数据(网络钩子请求体)

混合模式

兼得两者优点:稳定核心使用结构化列,可变部分使用 JSONB:

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

EAV 陷阱

经典的“实体-属性-值”模型——使用一张表存储 (key, value) 行——过去是稀疏数据的唯一选择。JSONB 用一个文档列取代了 EAV:

-- Old EAV:
CREATE TABLE user_attrs (
  user_id BIGINT,
  attr TEXT,
  val TEXT
);

-- Modern:
ALTER TABLE users ADD COLUMN attrs JSONB NOT NULL DEFAULT '{}';

-- JSONB queries are faster and easier than the EAV joins.

迁移策略

向高频使用的表添加一列 → 大表需要停机 5 分钟。使用 JSONB 时,添加字段只需修改应用代码。

JSONB 上的约束

添加 CHECK 约束以强制执行最低结构要求:

ALTER TABLE events
  ADD CONSTRAINT data_has_type CHECK (data ? 'type'),
  ADD CONSTRAINT type_is_string CHECK (jsonb_typeof(data->'type') = 'string');

提升高频字段

如果某个 JSONB 字段变得经常被查询,请将其提升为真正的列。UPDATE 脚本 + 新索引 + 新列可以让查询变快。

JSONB 补丁操作

更新单个字段:

UPDATE users
SET attrs = jsonb_set(attrs, '{plan}', '"pro"')
WHERE id = 1;

不要在 JSONB 中存储金额

金融数值需要精确的 NUMERIC 类型和约束。请始终使用真正的列。

JSONB 何时会带来问题

如果您发现自己在每个查询中都提取并转换同一个 JSONB 键,这就说明它应该成为一列。跨数百万行反复执行 (data->>'k')::INT 的累积成本会非常高。

模式文档

JSONB 列易于写入,却难以记录文档。请维护一个外部模式(JSON Schema、应用代码),让协作者了解应有的结构。

总结

JSONB 是一个强大的工具——将它用于可变部分,将真正的列用于稳定核心。当出现稳定的使用模式时,请将高频字段提升为列。

快速检查

您正在存储审计事件。事件类型始终存在;某些事件包含形状不固定的“参与者”数组。应如何对其建模?

常见问题解答

「建模:何时 JSONB 优于规范化」课时是免费的吗?

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

「建模:何时 JSONB 优于规范化」这节课中我会学到什么?

在 JSONB 列与独立表之间做出选择——灵活属性与严格模式之间的权衡 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

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

「建模:何时 JSONB 优于规范化」课时需要多长时间?

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

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

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

此课程中的所有课时

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