PostgreSQL引入的JSONB的解释
PostgreSQL刚刚推出了JSONB ,它已经在黑客新闻的趋势。 如果有人能够解释它与以前在PostgreSQL中出现的Hstore和JSON有什么不同,那将是一件好事。 什么是优点和限制,什么时候应该有人考虑使用它?
首先, hstore
是一个contrib模块,它只允许你存储key =>值对,其中键和值只能是text
(但是值也可以是sql NULL
)。
json
和jsonb
允许您存储有效的JSON 值 (在其规范中定义)。
F.ex. 这些是有效的JSON表示: null
, true
, [1,false,"string",{"foo":"bar"}]
, {"foo":"bar","baz":[null]}
– hstore
is只是一个小的子集相比,JSON的能力(但如果你只需要这个子集,那很好)。
json
和jsonb
之间唯一的区别是他们的存储:
-
json
以纯文本格式存储,而 -
jsonb
存储在一些二进制表示
这有三个主要的后果:
-
jsonb
通常需要更多的磁盘空间来存储比json
(有时不) -
jsonb
比json
需要更多的时间来从其input表示构build -
json
操作比jsonb
需要更多的时间(每次你用json
types的值进行一些操作时,parsing也需要完成)
当jsonb
将会有一个稳定版本的时候,将会有两个主要的用例,当你可以很容易地select它们时:
- 如果您只在应用程序中使用JSON表示,则PostgreSQL仅用于存储和检索此表示,您应该使用
json
。 - 如果您在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