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