PostgreSQL引入的JSONB的解释

PostgreSQL刚刚推出了JSONB ,它已经在黑客新闻的趋势。 如果有人能够解释它与以前在PostgreSQL中出现的Hstore和JSON有什么不同,那将是一件好事。 什么是优点和限制,什么时候应该有人考虑使用它?

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

jsonjsonb允许您存储有效的JSON (在其规范中定义)。

F.ex. 这些是有效的JSON表示: nulltrue[1,false,"string",{"foo":"bar"}]{"foo":"bar","baz":[null]}hstore is只是一个小的子集相比,JSON的能力(但如果你只需要这个子集,那很好)。

jsonjsonb之间唯一的区别是他们的存储:

  • json以纯文本格式存储,而
  • jsonb存储在一些二进制表示

这有三个主要的后果:

  • jsonb通常需要更多的磁盘空间来存储比json (有时不)
  • jsonbjson需要更多的时间来从其input表示构build
  • json操作比jsonb需要更多的时间(每次你用jsontypes的值进行一些操作时,parsing也需要完成)

jsonb将会有一个稳定版本的时候,将会有两个主要的用例,当你可以很容易地select它们时:

  1. 如果您只在应用程序中使用JSON表示,则PostgreSQL仅用于存储和检索此表示,您应该使用json
  2. 如果您在PostgreSQL中对JSON值进行了大量操作,或者在某个JSON字段上使用索引,则应该使用jsonb

Peeyush:

简短的回答是:

  • 如果你 PostgreSQL 里面做很多的JSON操作,比如sorting,切片,拼接等,你应该使用JSONB来提高速度。
  • 如果您需要对JSON进行任意键search的索引查找,那么您应该使用JSONB。
  • 如果你正在做上述任何一个,你应该使用JSON。
  • 如果您需要保留键sorting,空白键和重复键,则应该使用JSON。

为了得到更长的回答,您需要等待接近9.4版本的完整“HowTo”写法。

  • hstore更像是一个“宽列”存储types,它是一个键 – 值对的平面(非嵌套)字典,总是以合理有效的二进制格式(哈希表,因此名称)存储。
  • json将JSON文档存储为文本,在存储文档时执行validation,并在需要时parsing输出(即访问单个字段); 它应该支持整个JSON规范。 由于存储了整个JSON文本,所以其格式保存。
  • 由于性能原因, jsonb采取捷径:JSON数据在input时被parsing并以二进制格式存储,字典中的键sorting不被维护,也不是重复的键。 在JSONB字段中访问单个元素的速度很快,因为它不需要一直分析JSON文本。 在输出时,JSON数据被重build,初始格式化丢失。

国际海事组织,如果你正在使用机器可读的数据,一旦可用,没有重要的理由使用jsonb

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:文本存储«原样»
  • jsonb:没有空格
  • jsonb:没有重复的键,最后一个关键的胜利
  • jsonb:键被sorting

更多由Jsonb开发人员演讲的video和幻灯片演示 。 他们还介绍JsQuery ,pg.extension提供了强大的jsonb查询语言

我今天在pgopen,基准testing的速度比mongodb快,我相信它的select速度要快500%左右。 与mongodb相比,几乎所有的事情至less要快200%,现在比一个例外更新要求完全重写整个json专栏,mongodb处理得更好。

jsonb上的杜松子酒索引令人惊叹。

此外,postgres会在内部持久化jsonbtypes,并且基本上与数字,文本,布尔等types匹配。

join也将可能使用jsonb

为存储过程添加PLv8,这对node.js开发人员来说基本上是梦想成真。

被存储为二进制jsonb也将剥离所有的空白,改变属性的顺序,并删除重复属性使用属性的最后发生。

除了查询jsonb列和json列时的索引之外,postgres并不需要在每一行都实际运行将文本转换为json的function,这可能会节省大量的时间。

据我所知,

  • 因为它当前存在(在Postgresql 9.3中)hstore不允许嵌套其他对象和数组作为其键/值对的值。 但未来的hstore补丁将允许嵌套。 这个补丁不会在9.4发行版中,并且可能不会很快包含在内。

  • JSON,因为它目前存在允许嵌套,但是基于文本,并且不允许索引,因此它是“慢”

  • jsonb将会和9.4一起发布,具有json的当前嵌套function,以及hstore的GIN / GIST索引,所以它会很快

使用postgresql 9.4的人似乎认为,新的快速jsonbtypes会吸引那些select使用像MongoDB这样的noSQL数据存储的人,但是现在可以将关系数据库与能够查询的非结构化数据结合在一起

http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html

postgresql 9.4 jsonb的基准似乎与MongoDB相当或者在某些情况下比MongoDB更快

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