只刷新物化视图的一部分?

时间:2017-11-09 21:10:12

标签: postgresql

我的核心问题是我有一个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获取所有标记的列表。

这是功能性的,但有点不满意,因为它使标记数据非规范化 - rich_text列是权威值,但需要为查询计算和更新标记列。

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

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扫描每个文档。 / p>

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

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

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

1 个答案:

答案 0 :(得分:0)

你可以创建一个“懒惰”的游戏。或者'渴望'物化观点。阅读这篇文章: Materialized view strategies