【问题标题】:Indexing Postgresql JSONB arrays for element existence and unicity为元素存在和唯一性索引 Postgresql JSONB 数组
【发布时间】:2020-09-10 19:20:31
【问题描述】:

我有一个名为 posts 的 Postgresql 11.8 表,我想在其中定义 JSONB 类型的列 slugs,其中将包含字符串数组,例如 ["my-first-post", "another-slug-for-my-first-post"]。

我可以使用 ? 存在运算符找到具有特定 slug 的帖子:SELECT * FROM posts WHERE slugs ? 'some-slug'。

每个帖子预计只有少数 slug,但帖子的数量预计会增加。

考虑到上面的查询,some-slug 可以是任何字符串:

  • 如何定义索引以进行性能合理的查询(无全表扫描)?
  • 如何确保相同的 slug 不会出现多次(在不同的数组中和在不同的数组中)?

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

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

【问题讨论】:

  • 如果你想确保唯一性,为什么不直接使用表格呢?

标签: ruby-on-rails postgresql indexing jsonb unique-constraint


【解决方案1】:

您可以通过jsonb 列上的普通 GIN 索引来支持 ? 运算符。

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

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

【讨论】:

  • 谢谢劳伦兹。我的挑战来自另外需要翻译那些 slug。我想避免两个层次的关联。我跟进了这个关于 Rails 移动翻译库的问题:stackoverflow.com/q/63841953/4623987
猜你喜欢
  • 1970-01-01
  • 2017-04-12
  • 2017-09-11
  • 2018-04-28
  • 2011-10-08
  • 2020-11-11
  • 2020-03-25
相关资源
最近更新 更多