【问题标题】:What is the performance of Postgres jsonb_set as compared to MongoDB’s BSON update?与 MongoDB 的 BSON 更新相比,Postgres jsonb_set 的性能如何?
【发布时间】:2020-11-02 07:28:40
【问题描述】:

只是好奇,jsonb_set 每次都会读取值,修改它并重写它吗?与 mongodb 中的更新操作相比如何?

例如我有一个文件 ”table”:{“views”:{“123”:{“val”:”234”}}}

而我要进行的操作是修改val下的值。

SQL 语句如下所示

UPDATE atable SET data = jsonb_set(data, '...', '...', '...', TRUE)

【问题讨论】:

  • 答案取决于 SQL 语句——你能分享一下吗?
  • 比如我需要用下面的SET data = jsonb_set(data, '{"table", "views", "123", "val"}', '"456"', TRUE)设置新数据,所以”table”:{“views”:{“123”:{“val”:”234”}}}可以更新为”table”:{“views”:{“123”:{“val”:”456”}}}@LaurenzAlbe

标签: database mongodb postgresql nosql


【解决方案1】:

这是 PostgreSQL 的一面:

如果你UPDATEPostgreSQL 中的一个表行,则会写入完整行的新版本(旧版本的行留在表中以满足并发读取请求)。此外,jsonb_set 返回一个新的jsonb 对象,它不会修改作为第一个参数传递的对象。

如果您经常想要修改较大 JSON 对象的部分内容,您最终会写入比您想要的更多的数据。这是 PostgreSQL 架构的一部分。

对于大型对象,您最好对数据进行规范化,以使每次此类更新都会影响较小的表。

【讨论】:

  • 感谢 Laurenz 这回答了我的问题!只是想知道一对多的关系,postgres 有没有一种方法可以加速外键的 where 操作?例如,我将一个Table 映射到多个Views,我必须在View 下放置一个tableId 作为外键,每次扫描整个View 表以查找视图在特定的TabletableId 下对我来说似乎效率不高(我也会将一个View 映射到多个其他表!所以这基本上是一个树结构),这就是我为什么看jsonb解决方案
  • 这就是你index your foreign keys的原因,那么这绝不是问题。我的观点是,使用带有外键的关系数据模型通常会更好。
  • 哦,非常感谢 Laurenz,感谢您指点我。
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 2011-03-22
  • 2015-08-15
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
相关资源
最近更新 更多