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

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


当前回答

首先,hstore是一个contrib模块,它只允许你存储key =>值对,其中键和值只能是文本(但是值也可以是sql null)。

json和jsonb都允许你存储一个有效的json值(在其规范中定义)。

F.ex。这些是有效的JSON表示:null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]} - hstore只是JSON功能的一个小子集(但如果你只需要这个子集,也没关系)。

json和jsonb之间唯一的区别是它们的存储:

Json以纯文本格式存储,而 Jsonb以某种二进制表示形式存储

这有3个主要后果:

Jsonb通常比json占用更多的磁盘空间(有时不是) 与json相比,Jsonb需要更多的时间从其输入表示构建 Json操作要比jsonb花费更多的时间(并且每次在Json类型的值上执行一些操作时也需要进行解析)

当jsonb的稳定版本可用时,会有两个主要的用例,你可以很容易地在它们之间进行选择:

如果你只在应用程序中使用JSON表示,PostgreSQL只用于存储和检索这种表示,你应该使用JSON。 如果你在PostgreSQL中对JSON值做了很多操作,或者对一些JSON字段使用索引,你应该使用jsonb。

其他回答

JSONB是JSON的“更好”版本。

让我们来看一个例子:

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 stores white space, and that is why we can see spaces when key "a" is stored, while JSONB does not. JSON stores all the values of a key. This is the reason you can see multiple values (2 and 1) against the key "a" , while JSONB only "stores" the last value. JSON maintains the order in which elements are inserted, while JSONB maintains the "sorted" order. JSONB objects are stored as a decompressed binary as opposed to "raw data" in JSON, where no reparsing of data is required during retrieval. JSONB also supports indexing, which can be a significant advantage.

一般来说,应该更喜欢JSONB,除非有特殊的需要,比如对对象键的顺序有遗留的假设。

Peeyush:

简单的回答是:

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

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

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查询语言。

另一个重要的区别是,json类型没有相等操作符,但jsonb有。

这意味着在从表中选择json类型和/或其他字段时不能使用DISTINCT关键字(您可以使用DISTINCT ON代替,但由于这种情况,它并不总是可行的)。

首先,hstore是一个contrib模块,它只允许你存储key =>值对,其中键和值只能是文本(但是值也可以是sql null)。

json和jsonb都允许你存储一个有效的json值(在其规范中定义)。

F.ex。这些是有效的JSON表示:null, true, [1,false,"string",{"foo":"bar"}], {"foo":"bar","baz":[null]} - hstore只是JSON功能的一个小子集(但如果你只需要这个子集,也没关系)。

json和jsonb之间唯一的区别是它们的存储:

Json以纯文本格式存储,而 Jsonb以某种二进制表示形式存储

这有3个主要后果:

Jsonb通常比json占用更多的磁盘空间(有时不是) 与json相比,Jsonb需要更多的时间从其输入表示构建 Json操作要比jsonb花费更多的时间(并且每次在Json类型的值上执行一些操作时也需要进行解析)

当jsonb的稳定版本可用时,会有两个主要的用例,你可以很容易地在它们之间进行选择:

如果你只在应用程序中使用JSON表示,PostgreSQL只用于存储和检索这种表示,你应该使用JSON。 如果你在PostgreSQL中对JSON值做了很多操作,或者对一些JSON字段使用索引,你应该使用jsonb。