PostgreSQL 中的 JSON 与 JSONB
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
PostgreSQL® 提供两种数据类型来处理 JSON 数据:
JSON将 JSON 数据存储为文本,并对 JSON 语法的正确性进行验证。JSONB它以自定义二进制格式优化 JSON 存储。因此,除了验证 JSON 格式的正确性之外,还需要花费时间来正确解析和存储内容。
需要免费的 PostgreSQL 数据库?
🦀 查看Aiven 的免费方案!🦀
⚡️ 需要用 AI 优化 SQL 查询?⚡️
🐧 查看Aiven AI 数据库优化器!由 EverSQL 提供技术支持 🐧
注意:更多信息请参阅PostgreSQL JSON 类型文档页面。
JSON 和 JSONB 有什么区别?
贮存
主要区别在于数据的存储方式:虽然JSON将数据存储为文本,但通过创建树状结构JSONB来优化信息存储。
读写能力
两种格式都会进行内容验证,以确保输入是有效的 JSON 文档。但是,虽然JSON只进行整体检查,但JSONB数据随后会从字符串转换为树状结构。这种额外的处理意味着,由于解析过程更精简,插入数据时JSON速度更快JSONB。另一方面,在检索数据时,尤其是在仅选择文档子集的情况下,性能JSONB要好得多,因为解析二叉树的速度远快于扫描整个文档并选择部分子项。
内容不可更改性
使用时JSONB,可以修改 JSON 文档的内容:
- 删除不必要的空格:字符串外部的空格将被删除。
例如,字符串{"id": "123"}之间的 3 个空格将被删除,因为它们是不必要的。:123
- 重复键合并:如果文档的同一级别存在重复键,则只保留最后一个值。
例如,只会保留{"id":"123", "name":"Ugo", "name":"Francesco"}关联"name":"Francesco"关系。嵌套结构和数组将正确存储。
- 键的顺序可以改变:插入和检索 JSON 文档时,键的顺序可以改变。
例如,该文档{"id":"123", "name":"Ugo"}可以被检索为{"name":"Ugo", "id":"123"}
因此,如果您绝对需要保留空格、重复的键或键的顺序,则需要使用JSON。
索引
由于其优化的数据结构, PostgreSQLJSONB提供了对整个文档或部分文档进行索引的高级方法。更多信息请参阅PostgreSQL JSON 索引专题页面。
编辑
PostgreSQLJSON将 JSON 文档存储为文本,因此对文档的任何编辑都会导致整个内容被替换。
而JSONB则提供了一种方法,可以只编辑树中的特定条目,而不会更改文档的其余部分。更多信息请参阅“如何在 PostgreSQL 中编辑 JSON 文档?”。
概括
下表总结了PostgreSQL 中数据类型JSON之间的区别。JSONB
| 质量 | JSON |
JSONB |
|---|---|---|
| 数据存储格式 | 原始文本 | 自定义二进制文件 |
| 写 | 编写速度更快,仅需最少的 JSON 验证 | 由于二进制转换开销,写入速度较慢。 |
| 读 | 阅读速度较慢,需要重新解析。 | 阅读速度更快 |
| 留白 | 保存完好 | 已移除 |
| 重复的钥匙 | 保存完好 | 只保留最后一个值。 |
| 钥匙顺序 | 保存完好 | 可以更改 |
| 指数支持 | 不 | 是的 |
| JSON 项目编辑支持 | 不 | 是的 |
请查看主页上列出的所有 JSON PostgreSQL 用例
文章来源:https://dev.to/ftisiot/json-vs-jsonb-in-postgresql-5cj3