JSONB使PostgreSQL数组无用吗?

时间:2015-03-08 17:53:21

标签: arrays postgresql database-design postgresql-9.4 jsonb

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

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

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

因此,选择主要在text[]jsonb之间。两者都可以查询 你会用什么?为什么?

2 个答案:

答案 0 :(得分:5)

在大多数情况下,我会使用normalized schema与表格option_tag来实现表格optiontag之间的多对多关系。这里的参考实现:

它可能不是各个方面的最快选项,但它提供了全方位的数据库功能,包括参照完整性,约束,所有数据类型,所有索引选项和廉价更新。

为完整起见,请添加到选项列表中:

  • hstore(不错的选择)
  • xmlhstorejsonb更详细,更复杂,所以我只会在使用XML时使用它。
  • “逗号分隔值的字符串”(非常简单,大多数是错误的选项)
  • EAV(实体 - 属性 - 值)或“名称 - 值对”(主要是坏选项)
    有关dba.SE的相关问题的详情:

如果列表只是用于显示而很少更新,我会考虑一个普通的数组,它通常比较小,并且比其他数据表现更好。

阅读评论中链接的blog entry by Josh Berkus @a_horse。但请注意,它侧重于选定的读取案例。乔希承认:

  

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

这就是规范化方法获胜的地方,尤其是在并发负载下大量更改单个标签时。

jsonb只是一个不错的选择,如果您打算使用JSON,并且可以“按原样”存储和检索JSON。

答案 1 :(得分:1)

我既使用了规范化架构,又使用了一个简单的text字段,其中包含CSV分隔值而不是自定义数据类型(而不是CSV,您可以使用JSON或其他任何编码,如www-urlencoding甚至XML属性编码)。这是因为许多ORM和数据库库不支持自定义数据类型(hstore,jsonb,array等)。

@ErwinBrandstetter错过了标准化的一些其他好处,即在规范化模式中查询所有可能以前使用的标签比使用数组选项快得多。这是许多标签系统中非常常见的情况。

话虽如此,我建议使用Solr(或elasticsearch)来查询标签,因为它处理标签计数和一般标签前缀搜索远比我愿意处理一致性方面的Postgres要好得多。与搜索引擎同步。因此,标签的存储变得不那么重要了。