我的核心问题是我有一个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字段没有重新计算标签列。)