postgresql - 用于用户元数据的 Postgres JSONB 与 NoSQL 文档存储
问题描述
我目前正在构建一个对用户“配置文件”执行基本 CRUD 操作的服务。这些配置文件实际上就像一个元数据/首选项存储——我们已经有其他表来存储“规范”信息,如姓名、电子邮件等。这个配置文件将用于不太重要的数据,比如“这个用户有宠物吗”;这些属性将是非常动态的,所以我正在考虑将它们存储在 JSONB 字段中:
CREATE TABLE user_profile (
user_id int,
created_on bigint,
modified_on bigint,
-- some other stuff...
profile jsonb
)
我的初衷是研究为此使用某种 NoSQL 解决方案,但似乎 Postgres 的 JSONB 支持已经足够成熟,很难证明将新技术引入我们现有的堆栈是合理的。几个问题:
- 大型文档的性能是否不错?我最初读到有些人对大型 JSONB 存在性能问题(可能索引不正确),因为必须烘烤/取消烘烤大量记录。但是我们的大多数查询都将被索引
user_id
,并且我们将一次获取一个配置文件,所以这感觉可能不是问题。虽然在某些时候我们可能想要创建,例如,一次修改大批量配置文件的异步作业,但似乎添加适当的 GIN 索引可以促进这一点。这些配置文件的主要用途是单行 GET/UPDATE,索引在user_id
. - 更新 JSONB 中的单个键/值的性能如何?对我来说似乎吸引我的一件事,例如 Mongo,是更新可以就地发生,而 Postgres 总是会在更新时重写整个 JSONB 字段。再加上这个
profile
领域可以变得相当大的事实让我有点紧张。也就是说,我不知道这样的事情在现实中会产生多大的性能影响。
鉴于这种用例 + 访问模式,我想知道切换到 NoSQL 解决方案是否有任何性能理由,或者 JSONB 是否足够。
解决方案
推荐阅读
- java - 如何在 Java 8 上创建 Java 两步验证?
- javascript - 如何从 AngularJS 或 JavaScript 中获取值
- excel - 前装和后装 | Excel中的正态分布柱形图和S曲线
- javascript - Jquery删除多个选择选项上的重复项,同时保持“选定”属性
- elasticsearch - Elasticsearch - 递归嵌套 JSON 对象
- python - 摆脱 Pandas 中的多个名称
- ios - 如何禁用或覆盖在 ios 中启动的应用程序
- java - 如何更改 VSCode 的默认终端
- google-sheets - 将范围导入每第 N 行
- python - 提高循环遍历 pandas 数据帧的效率