假设您要存储"标签"在你的对象(比如一个帖子)上。在9.4版本中,您有3个主要选择:
在许多情况下,第3个将是不可能的,因为它不会允许查询条件为“#”标签'值。在我目前的开发中,我不需要这样的查询,标签只会在帖子列表中显示,而不是过滤帖子。
因此,选择主要在text[]
和jsonb
之间。两者都可以查询
你会用什么?为什么?
答案 0 :(得分:5)
在大多数情况下,我会使用normalized schema与表格option_tag
来实现表格option
和tag
之间的多对多关系。这里的参考实现:
它可能不是各个方面的最快选项,但它提供了全方位的数据库功能,包括参照完整性,约束,所有数据类型,所有索引选项和廉价更新。
为完整起见,请添加到选项列表中:
hstore
(不错的选择)xml
比hstore
或jsonb
更详细,更复杂,所以我只会在使用XML时使用它。如果列表只是用于显示而很少更新,我会考虑一个普通的数组,它通常比较小,并且比其他数据表现更好。
阅读评论中链接的blog entry by Josh Berkus @a_horse。但请注意,它侧重于选定的读取案例。乔希承认:
我意识到我没有测试比较写入速度。
这就是规范化方法获胜的地方,尤其是在并发负载下大量更改单个标签时。
jsonb
只是一个不错的选择,如果您打算使用JSON,并且可以“按原样”存储和检索JSON。
答案 1 :(得分:1)
我既使用了规范化架构,又使用了一个简单的text
字段,其中包含CSV分隔值而不是自定义数据类型(而不是CSV,您可以使用JSON或其他任何编码,如www-urlencoding甚至XML属性编码)。这是因为许多ORM和数据库库不支持自定义数据类型(hstore,jsonb,array等)。
话虽如此,我建议使用Solr(或elasticsearch)来查询标签,因为它处理标签计数和一般标签前缀搜索远比我愿意处理一致性方面的Postgres要好得多。与搜索引擎同步。因此,标签的存储变得不那么重要了。