PostgreSQL刚刚在9.4版中引入了JSONB,它已经成为了黑客新闻的热门话题。它与之前在PostgreSQL中出现的Hstore和JSON有什么不同?

它的优点和局限性是什么?什么时候应该考虑使用它?


当前回答

我今天在PostgresOpen上,基准测试比MongoDB快多了。我相信它的选择速度快了500%。几乎所有东西都更快,与MongoDB相比至少快了200%。现在的一个例外是需要完全重写整个JSON列的更新——这一点MongoDB处理得更好。

JSONB上的gin索引听起来很棒。

PostgreSQL还将在内部持久化JSONB类型,并将其与数字、文本、布尔等类型进行匹配。

使用JSONB也可以实现连接。

为存储过程添加PLv8,这将是Node.js开发者的梦想成真。

由于它被存储为二进制,JSONB还将删除所有空白,改变属性的顺序,并使用属性的最后一次出现来删除重复的属性。

除了索引,当查询JSONB列和JSON列时,PostgreSQL不需要实际运行将每一行的文本转换为JSON的功能,这可能会节省大量的时间。

其他回答

json和jsonb之间的区别的简单解释(原始图片来自PostgresProfessional):

SELECT '{"c":0,   "a":2,"a":1}'::json, '{"c":0,   "a":2,"a":1}'::jsonb;

          json          |        jsonb 
------------------------+--------------------- 
 {"c":0,   "a":2,"a":1} | {"a": 1, "c": 0} 
(1 row)

Json:文本存储«as is» Jsonb:没有空格 没有重复的键,最后一个键获胜 Jsonb:键排序

更多的演讲视频和幻灯片演示由jsonb开发人员。他们还引入了JsQuery,一个pg.extension,提供了强大的jsonb查询语言。

我今天在PostgresOpen上,基准测试比MongoDB快多了。我相信它的选择速度快了500%。几乎所有东西都更快,与MongoDB相比至少快了200%。现在的一个例外是需要完全重写整个JSON列的更新——这一点MongoDB处理得更好。

JSONB上的gin索引听起来很棒。

PostgreSQL还将在内部持久化JSONB类型,并将其与数字、文本、布尔等类型进行匹配。

使用JSONB也可以实现连接。

为存储过程添加PLv8,这将是Node.js开发者的梦想成真。

由于它被存储为二进制,JSONB还将删除所有空白,改变属性的顺序,并使用属性的最后一次出现来删除重复的属性。

除了索引,当查询JSONB列和JSON列时,PostgreSQL不需要实际运行将每一行的文本转换为JSON的功能,这可能会节省大量的时间。

据我所知

hstore as it currently exists (in PostgreSQL 9.3) does not allow for nesting other objects and arrays as the values of its key/value pairs. However, a future hstore patch will allow for nesting. This patch will not be in the 9.4 release and may not be included any time soon. json as it currently exists does allow for nesting, but it is text-based and does not allow for indexing, thus it is "slow" jsonb that will be released with 9.4 will have the current nesting capabilities of json, as well as the GIN/GIST indexing of hstore, so it will be fast

开发PostgreSQL 9.4的人似乎在说,新的、快速的jsonb类型将吸引那些选择使用像MongoDB这样的NoSQL数据存储的人,但它现在可以将关系数据库和可查询的非结构化数据组合在一个框架下

为什么HStore2/jsonb是9.4最重要的补丁

PostgreSQL 9.4 jsonb的基准测试似乎与MongoDB相当,在某些情况下甚至比MongoDB更快。

http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb

Peeyush:

简单的回答是:

如果你在PostgreSQL中做很多JSON操作,比如排序、切片、拼接等,出于速度考虑,你应该使用JSONB。 如果需要对JSON上的任意键搜索进行索引查找,那么应该使用JSONB。 如果以上两种方法都不使用,则可能应该使用JSON。 如果需要保留键顺序、空格和重复的键,则应该使用JSON。

想要得到更长的答案,你需要等我在9.4发行版之前写一篇完整的“HowTo”文章。

关于json和jsonb数据类型之间的差异,值得一提的是官方的解释:

PostgreSQL offers two types for storing JSON data: json and jsonb. To implement efficient query mechanisms for these data types, PostgreSQL also provides the jsonpath data type described in Section 8.14.6. The json and jsonb data types accept almost identical sets of values as input. The major practical difference is one of efficiency. The json data type stores an exact copy of the input text, which processing functions must reparse on each execution; while jsonb data is stored in a decomposed binary format that makes it slightly slower to input due to added conversion overhead, but significantly faster to process, since no reparsing is needed. jsonb also supports indexing, which can be a significant advantage. Because the json type stores an exact copy of the input text, it will preserve semantically-insignificant white space between tokens, as well as the order of keys within JSON objects. Also, if a JSON object within the value contains the same key more than once, all the key/value pairs are kept. (The processing functions consider the last value as the operative one.) By contrast, jsonb does not preserve white space, does not preserve the order of object keys, and does not keep duplicate object keys. If duplicate keys are specified in the input, only the last value is kept. In general, most applications should prefer to store JSON data as jsonb, unless there are quite specialized needs, such as legacy assumptions about ordering of object keys. PostgreSQL allows only one character set encoding per database. It is therefore not possible for the JSON types to conform rigidly to the JSON specification unless the database encoding is UTF8. Attempts to directly include characters that cannot be represented in the database encoding will fail; conversely, characters that can be represented in the database encoding but not in UTF8 will be allowed.

来源:https://www.postgresql.org/docs/current/datatype-json.html