postgresql - 只刷新物化 View 的一部分?

标签 postgresql

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

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

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

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

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

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;

这行得通,但我现在每次更新、删除或插入文档时都必须刷​​新物化 View ,我认为这不会很好地扩展 - 因为它需要基本上顺序扫描每个文档。

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

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

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

最佳答案

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

关于postgresql - 只刷新物化 View 的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47211576/

相关文章:

ruby - 无法查询与 Sequel gem 的一对多关系?

java - 将 PostgreSQL 查询转换为 DSLContext 的问题

arrays - PostgreSQL:将动态 ARRAY 插入函数

sql - Postgres 9.4 jsonb 数组作为表

postgresql - 如何在 Postgresql 中水平组契约(Contract)一个表上的两个选择查询?

json - breezejs - 无模式的复杂属性

sql - 检测整数序列中的间隙

postgresql - 从 postgresql 中的 jsonb 嵌套数组中删除键值对

postgresql - pgAdmin 和终端 : FATAL: password authentication failed for user

ruby-on-rails - Ruby has_many 关联模型查询与 Postgres 数据库 (Rails 5)