知识卡片
JSONB宽表模式:把模式变更成本从"改表结构"下放到"改字段内部数据"
内容
在传统企业系统里,业务形态可能随时变化,为了应对这种不确定性,数据库设计时经常会预先建很多冗余字段的”宽表”(提前预留大量可能用得上、也可能永远用不上的列),以便未来业务变化时不需要频繁改表结构。PostgreSQL的JSONB数据类型为这个问题提供了另一种解法:把原本要拆成一堆冗余列的”宽表”字段,收敛成一个JSONB字段整体存储,具体业务属性以JSON键值对的形式动态存在这个字段里,未来新增或调整业务属性时不需要修改表结构(不需要ALTER TABLE加列),只需要调整写入这个JSONB字段的数据结构;如果某个属性后续被证明查询频繁、需要提速,还可以针对JSONB字段内部的具体属性单独建索引(如GIN索引),兼顾灵活性与查询性能。这种”用一个半结构化字段承载易变属性、按需对内部属性索引”的模式,对政务资产管理、医疗病历、教育考卷、零售商品资料等属性集合本身会持续演变的业务场景都有参考价值,本质是把”模式变更”的成本从”改表结构”下放到了”改字段内部数据”。
参考来源
- 位置:《高可用架构(第1卷)》第6章《大数据与数据库》"6.10 从Postgres95到PostgreSQL9.5:新版亮眼特性"节,"6.10.3 PostgresSQL9.5的亮眼特性"(源文件:_epub-src/OEBPS/Text/Chapter6_10_4.xhtml)
- 结论依据:原文说明"在PostgreSQL中使用JSON除了可以更好地处理移动互联网数据外,对于传统业务中由于业务形态可能随时变化,而导致的数据库中'宽表'设计也有很大的帮助……在PostgreSQL中可以将所有'宽表'的列定义成一个JSONB字段,未来因响应数据操作需求,可以再进行不同属性的索引处理",直接支撑本卡片结论。
- 原始内容:在PostgreSQL中使用JSON除了可以更好地处理移动互联网数据外,对于传统业务中由于业务形态可能随时变化,而导致的数据库中"宽表"设计也有很大的帮助……在PostgreSQL中可以将所有"宽表"的列定义成一个JSONB字段,未来因响应数据操作需求,可以再进行不同属性的索引处理。