为元素存在性和唯一性索引 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 可以是任何字符串:

我主要是在寻找 Postgresql 11 的解决方案,但也有兴趣了解未来版本的解决方案(如果有的话)。

该数据库在 Rails 6.0 应用程序中使用,因此我也对 Rails 迁移语法感兴趣。

您可以在 jsonb 列上使用普通 GIN 索引来支持 ? 运算符。

但是,您不能强制数组值的唯一性。

特别是如果您想要有数据库约束,您应该而不是使用JSON对数据建模。使用具有多个表和外键的常规规范化数据模型,那么很容易实现这样的唯一性约束。