标准答案

  1. JSONB 能保留半结构化对象并支持路径查询,但字段类型、默认值、唯一性、外键和状态迁移不会因为放进 JSONB 就自动得到数据库约束。
  2. 常用路径可以用 expression index、GIN 或其他索引支持,但索引大小、更新写放大、查询操作符和统计信息都要按真实数据验证。
  3. 如果字段参与高频过滤、排序、范围查询、关联、聚合或权限判断,拆成类型明确的列通常更容易建立约束、索引和稳定执行计划。
  4. JSONB 更适合扩展属性、外部原始 payload 或变化频繁且不参与核心关系的字段;核心业务事实仍应有明确模型和校验。
  5. 迁移策略要考虑旧对象缺字段、字段类型变化、历史数据回填和新旧版本兼容,不能只依赖应用代码“记得按新格式读取”。

题目解析

JSONB 的价值是让表示层更灵活,不是取消数据建模。把支付金额、租户归属或订单状态藏在 JSONB 中,会让唯一性、权限和事务不变量更难由数据库保护。

决定拆列还是保留 JSONB 时,应列出字段的访问频率、约束、关联、生命周期和变化频率。稳定且关键的字段适合显式建模,低频扩展属性可以保留在 JSONB。

性能验证不能只测单次 JSONB 查询,还要看写入、索引更新、表膨胀、统计信息和不同对象大小下的 P99。

常见误区

  • 误区:把整张业务表塞进一个 JSONB。改正:核心身份、状态、金额、租户和关系仍应由明确列与约束表达。
  • 误区:建立一个巨大的 GIN 索引就能解决所有路径查询。改正:操作符、索引表达式、数据分布和写入成本都要单独验证。
  • 误区:JSONB 字段变更只需要改读取代码。改正:还要处理历史数据、类型兼容、回填、索引和新旧版本共存。

作者信息