【问题标题】:refresh only part of a materialized view?只刷新物化视图的一部分?
【发布时间】:2017-11-10 05:36:25
【问题描述】:

我的核心问题是我有一个 jsonb 数据库列,其中数据的形状如下:

{"ops": [
  {"insert": "yaaaah "},
  {"insert": {"atmention": {"id": "183"}}}, 
  {"insert": "  "},
  {"insert": {"hashtag": "potato"}},
  {"insert": " \n"}
]}

(它是前端 quill 字段的输出,我不想更改该结构)。目前,我的 API 注意到该字段有一个 hashtag 条目,并通过提取主题标签条目(在本例中为“土豆”)并更新存储标签的 text[] 列来手动刷新数据库中的标签列。然后我可以通过@> tags 查询匹配项,或者通过select distinct unnest(tags) from documents 获取所有标签的列表。

这是功能性的,但有点不令人满意,因为它对标签数据进行了非规范化 - 富文本列是权威值,但需要计算和更新标签列以进行查询。

我想我想做的是制作文档-标签对的物化视图,例如:

create materialized view hashtags
with taglist as (
  select documents.id, 
  jsonb_array_elements(rich_text->'ops') as ops from documents
) 
select 
  taglist.id,
  ops->'insert'->'hashtag'
from taglist 
where ops->'insert'->'hashtag' is not null;

这可行,但我现在必须在每次更新、删除或插入文档时刷新物化视图,而且我认为这不会很好地扩展 - 因为它基本上需要对每个文档进行 seq 扫描。

我想知道是否有某种方式可以说“嘿,通过删除 id = 1 的元素来刷新物化视图,然后重新运行documents.id = 1的查询”。我会知道视图中的哪些条目可以更改,并且只想更改它们。

其他建议,例如有效索引此列的方法(这是一个带有单个顶级键“ops”的 jsonb 元素,其值始终是一个以“插入”作为顶级键的对象数组,这可能有文本或进一步的对象值,也可能有“插入”的“属性”顶级键兄弟),欢迎使用。

我的目标是将“本文档中有哪些标签”和“一般有哪些标签”和“哪些文档用土豆标记”查询的计算转移到 SQL 中,而不是使用我目前使用的非规范化技术使用(再次:功能,但有点不满意,因为这意味着我必须维护这个额外的列,并且可以想象数据进入未定义状态,好像标签列以某种方式直接编辑,或者rich_text字段被更新无需重新计算标签列)。

【问题讨论】:

  • 没有。但你可以运行delete where id+insert select your query where id - 从某种意义上说,这将是相同的部分实现。

标签: postgresql


【解决方案1】:

您可以创建“Lazy”或“Eager”物化视图。阅读有关它们的文章: Materialized view strategies

【讨论】:

  • 嗯,是的 - 也许答案是偶尔刷新 matview - 我的用户可以忍受这些标签问题的答案已经过时了几分钟(或者更多,真的),然后只是定期刷新已更改的内容。
  • 好的。请记住,“当您想要更多时,您需要做更多”;)
猜你喜欢
  • 2019-01-10
  • 2021-10-14
  • 2014-07-11
  • 2017-11-13
  • 1970-01-01
  • 2010-12-19
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多