【发布时间】:2019-12-11 07:10:36
【问题描述】:
问题
如何基于 JSONB 字段对象数组 制作PostgreSQL 视图,并带有适当的索引?下面的例子。
- 从概念上讲,在使用视图和 JSONB 数组时应如何应用索引?
- 创建相关索引的正确语法是什么?
- 是否为示例视图提供了构建此用例视图的正确/最佳方式?
示例
表格
CREATE TABLE "ProductLists"
(
id uuid NOT NULL DEFAULT gen_random_uuid(),
listName text NOT NULL
productIds jsonb NOT NULL DEFAULT '[{ productId:0 }]'::jsonb,
)
视图(可更改)
有以下观点:
SELECT "ProductLists".id AS listId,
jsonb_array_elements("ProductLists".productIds) ->> 'productId'::text AS productId
FROM "ProductLists";
因素
- JSONB Root 是一个数组,而不是一个对象(在大多数索引示例中并非如此)
- 可能会有数百万个 ProductList 项
- 每个列表中的 productId 数量通常少于 100 个
- 该表将同时具有高读取和写入
- 视图 SQL 示例可能适合也可能不是最佳用途,并且可以更改
感谢您的任何意见!
【问题讨论】:
-
最有效的方法是规范化你的数据模型。 blog.2ndquadrant.com/…
-
与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
-
您打算在该表上运行什么样的查询?什么样的条件?
-
@a_horse_with_no_name,感谢您的回复。关于引用标识符的好提示。 RE:场景和查询类型。基本上,我需要维护许多有序的产品列表。顺序很重要。以前我使用带有 productId、listId 和 listOrder 字段的映射表。但是,列表经常更改。长列表的重新排序操作可能导致需要更新 100 行中的
listOrder值。我正在考虑使用 JSONB 字段来避免这种情况。一个有序列表,整齐地存储在一个字段中。 -
@a_horse_with_no_name - (不来自上述评论)。最常见的查询只是获取列表的 productIds。 JSONB 解决方案在这里效果很好。但是,不常见的操作是删除产品 - 在这种情况下,需要识别给定 productId 的所有列表。这就是我在这里尝试解决的用例,通过索引 JSONB 字段并添加视图
标签: postgresql indexing view jsonb