JSONB使PostgreSQL数组无用吗?

com*_*mte 13 arrays postgresql database-design jsonb postgresql-9.4

假设您要在对象上存储"标签"(例如,帖子).在9.4版本中,您有3个主要选择:

  • 标签为文本[]
  • 标签为jsonb
  • 标记为文本(并将JSON字符串存储为文本)

在许多情况下,第3个将是不可能的,因为它不允许查询条件为"标签"值.在我目前的开发中,我不需要这样的查询,标签只在帖子列表中显示,而不是过滤帖子.

所以,选择主要是在text[]和之间jsonb.两者都可以查询.
你会用什么?为什么?

Erw*_*ter 7

在大多数情况下,我会在表格中使用规范化的架构,以option_tag实现表格option和之间的多对多关系tag。参考实现在这里:

它可能并不是在所有方面都最快的选项,但是它提供了全部的DB功能,包括引用完整性,约束,数据类型的全部范围,所有索引选项和廉价的更新。

为了完整性,请添加到您的选项列表中:

  • hstore (不错的选择)
  • xmlhstoreor 更为冗长和复杂jsonb,因此我只会在与XML一起使用时使用它。
  • “用逗号分隔的值的字符串”(非常简单,多数情况下是错误的选择)
  • EAV(实体-属性-值)或“名称-值对”(通常是错误的选择)
    在dba.SE上此相关问题下的详细信息:

如果该列表仅用于显示并且很少更新,那么我将考虑一个普通数组,该数组通常较小,并且在性能上要优于其余数组。

阅读Josh Berkus @a_horse在其评论中链接的博客条目。但是请注意,它只针对选定的案例。乔希承认:

我意识到我没有测试比较写入速度。

这就是归一化方法大获成功的地方,尤其是当您在并发负载下大量更改单个标签时。

jsonb 如果您仍要使用JSON进行操作,并且仅能“按原样”存储和检索JSON,则最好是一个好选择。

  • 这就是为什么在我看来,ORM的收益值得怀疑。不确定您在简单中获得的价值是否值得您在灵活性中失去的价值。他们落后于数据库进度,需要花费很少的钱。但这只是个人观点。 (2认同)
  • @comte:如果您愿意,您可以将涉及的联接制定为子查询。但是,虽然连接是有成本的,但“连接速度慢”的说法太不具体,不可能是真的。这取决于。 (2认同)