Postgres: hstore与json大比拼
和人们谈论Postgres发现了一个问题是hstore与json哪个更好。我该使用了哪个以及在哪种情况下使用。首先,如果你不熟悉,请查看关于它们的一些资料:
如果你已经对它俩很了解了,但是还是迷惑该使用哪个,那我们深入讨论:
hstore
hstore 是键值对直接存储在你的数据中。它是我最爱的而且它已经存在了很长时间了。在处理数据模式(schema)时hstore可以给你很大弹性。如同你不用提前定义模式(models),但是它有两大局限:
1.它只处理文本。
2. 它不支持全文档存储意味着你不能嵌套对象。
但是hstore主要特性包括可以在其上使用索引,众多操作符强有力支持,显而易见的,对数据的扩张性。一些基本的操作符包括:
返回列foo中关键字bar的值:
foo->"bar"指定的列foo是否包含了关键字bar:
foo?"bar"指定的列foo是否包含了键值对bar->baz:
foo@>"bar->baz"也许hstore最有戏的部分是你可以在其上索引。Postgres特有的gin和gist允许你在hstore中索引所有的关键字和值。一个由Postgres专家Christophe Pettus的演讲指出了 ,其中在某些情况下hstore使用git/gist在性能上完胜mongodb.
Json
和hstore相比,JSON是全文档数据类型。另外它嵌套对象的特性可以帮助你支持很多不仅仅是文本,还可以读取数字的功能。如你使用json插入到postgres中它会自动保证它是合法的JSON格式,如果不是就会报错。JSON在Postgres 9.3会得到更好的支持,如,但是如果你现在需要更多的函数,你需要查看.
该使用哪个
在你的应用中哪个会是你实际想去使用的呢?如果你已经使用JSON以及简单的想存储在你的数据库中,那么JSON数据类型通常就是正确的选择。然而,如果你想在数据模型中寻找更大的弹性,那么hstore就是你所选之路。hstore会给你很多灵活性以及高性能的查询你的数据。当然在Postgres 9.3中会是全新的改变。
via
附
究竟什么才是最重要的问题?
Craig Kerstiens给出了两者类型的大概,我想给出一种快速粗糙的图来说明我会使用哪个在开发环境中。首先,hstore几乎在每种情况都比JSON性能上更优秀,但是性能只是当你开发系统所做那些烦人决策点之一如同彩虹中的一种颜色。
所以,我该怎么做?
- 如果是以JSON格式从外部接受数据,想以分级格式存储它,它就会是一个性能问题因为它会花费一些时间来转换它为hstore格式。
- 如果是从内部产生数据,而不是从它几乎完成的格式接受,并且分层不是很深,我会使用hstore,就为它更快的性能。
- 如果保留值的类型是必需的,JSON就是不二选择,因为hstore存储所有的都是字符串格式。
- 如果在键值对中全文档查询是必需的,当前hstore索引情况比JSON的更优秀。
- 如果你仅仅查询前几条(1-3)记录,那么在关键字上使用b-tree索引比使用gist或者git索引更好; 在这个方面hstore没有比json更特别优点。
在我看来,随着JSON在PostgreSQL中支持越来越成熟,这种格局会有所改变,而且意义重大。但是这只是9.2情形。
via