为元素存在性和唯一性索引 Postgresql JSONB 数组
Indexing Postgresql JSONB arrays for element existence and unicity
我有一个名为 posts
的 Postgresql 11.8 table,我想在其中定义一个 JSONB 类型的列 slugs
,它将包含字符串数组,例如 ["my-first-post", "another-slug-for-my-first-post"]
.
我可以使用 ?
存在运算符找到具有特定 slug 的 post:SELECT * FROM posts WHERE slugs ? 'some-slug'
.
每个 post 预计只有少量鼻涕虫,但 post 的数量预计会增加。
考虑上面的查询,其中 some-slug
可以是任何字符串:
- 我如何定义一个索引以获得合理的性能查询(没有完整的 table 扫描)?
- 如何确保同一个 slug 不会出现多次(在不同阵列之间和内部)?
我主要是在寻找 Postgresql 11 的解决方案,但也有兴趣了解未来版本的解决方案(如果有的话)。
该数据库在 Rails 6.0 应用程序中使用,因此我也对 Rails 迁移语法感兴趣。
您可以在 jsonb
列上使用普通 GIN 索引来支持 ?
运算符。
但是,您不能强制数组值的唯一性。
特别是如果您想要有数据库约束,您应该而不是使用JSON对数据建模。使用具有多个表和外键的常规规范化数据模型,那么很容易实现这样的唯一性约束。
我有一个名为 posts
的 Postgresql 11.8 table,我想在其中定义一个 JSONB 类型的列 slugs
,它将包含字符串数组,例如 ["my-first-post", "another-slug-for-my-first-post"]
.
我可以使用 ?
存在运算符找到具有特定 slug 的 post:SELECT * FROM posts WHERE slugs ? 'some-slug'
.
每个 post 预计只有少量鼻涕虫,但 post 的数量预计会增加。
考虑上面的查询,其中 some-slug
可以是任何字符串:
- 我如何定义一个索引以获得合理的性能查询(没有完整的 table 扫描)?
- 如何确保同一个 slug 不会出现多次(在不同阵列之间和内部)?
我主要是在寻找 Postgresql 11 的解决方案,但也有兴趣了解未来版本的解决方案(如果有的话)。
该数据库在 Rails 6.0 应用程序中使用,因此我也对 Rails 迁移语法感兴趣。
您可以在 jsonb
列上使用普通 GIN 索引来支持 ?
运算符。
但是,您不能强制数组值的唯一性。
特别是如果您想要有数据库约束,您应该而不是使用JSON对数据建模。使用具有多个表和外键的常规规范化数据模型,那么很容易实现这样的唯一性约束。