PostgreSQL刚刚推出JSONB,它已经在hacker news上趋势 . 如果有人可以解释它的优点和局限以及何时有人考虑使用它会很棒?
首先,hstore是一个contrib模块,它只允许存储key => value对,其中键和值只能是 text s(但值也可以是sql NULL ) .
text
NULL
json 和 jsonb 都允许您存储有效的JSON值(在其spec中定义) .
json
jsonb
F.ex.这些是有效的JSON表示: null , true , [1,false,"string",{"foo":"bar"}] , {"foo":"bar","baz":[null]} - hstore 只是JSON能力的一个小子集(但如果你只需要这个子集,那就没关系) .
null
true
[1,false,"string",{"foo":"bar"}]
{"foo":"bar","baz":[null]}
hstore
json 和 jsonb 之间的唯一区别是它们的存储:
json 以纯文本格式存储,而
jsonb 以某种二进制表示形式存储
这有三个主要后果:
jsonb 通常比 json 需要更多的磁盘空间(有时不会)
jsonb 需要更多时间来构建其输入表示而不是 json
json 操作比 jsonb 花费的时间要多得多(每次在 json 类型的值上执行某些操作时也需要进行解析)
当 jsonb 可用于稳定版本时,将有两个主要用例,当您可以轻松地在它们之间进行选择时:
如果您只在应用程序中使用JSON表示,PostgreSQL仅用于存储和检索此表示,您应该使用 json .
如果您对PostgreSQL中的JSON值执行了大量操作,或者在某些JSON字段上使用索引,则应使用 jsonb .
jsonb是JSON的“更好”版本 . 让我们借助一个例子来检查 .
JSON允许使用空格,这就是为什么我们可以在存储键"a"时看到空格,而JSONB则不然 .
JSON存储key的所有值 . 这就是你可以看到针对键"a"的多个值(2和1)的原因,而JSONB只是"stores"最近的值 .
JSON维护元素被插入的顺序,而JSONB维护"sorted"顺序 .
JSONB对象存储为解压缩二进制文件,而不是JSON中的"raw data",其中在检索期间不需要重新分析数据 .
jsonb也支持索引,这可能是一个显着的优势 .
通常,人们应该更喜欢JSONB,除非有非常特殊的需求,例如关于对象键排序的遗留假设 .
在上面的任何答案中都没有提到的另一个重要区别是 json 类型没有相等运算符,但 jsonb 有一个 .
这意味着从表中选择 json -type和/或其他字段时不能使用 DISTINCT 关键字(您可以改为使用 DISTINCT ON ,但由于this等情况,并不总是这样) .
DISTINCT
DISTINCT ON
Peeyush:
简短的回答是:
如果你在PostgreSQL中进行了很多JSON操作,比如排序,切片,拼接等,你应该出于速度原因使用JSONB .
如果您需要对JSON上的任意键搜索进行索引查找,那么您应该使用JSONB .
如果您没有采用上述两种方法,则应该使用JSON .
如果需要保留密钥排序,空格和重复密钥,则应使用JSON .
对于更长的答案,你需要等待我在9.4版本附近做一个完整的“HowTo”写作 .
json和jsonb(original image by 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:键已排序
更多在jsonb开发人员的speech video和slide show presentation . 他们还介绍了JsQuery,pg.extension提供了强大的jsonb查询语言
我今天在pgopen基准测试比mongodb更快,我认为选择速度快了约500% . 与mongodb相比,几乎所有东西都至少快了200%,而现在的一个例外是需要完全重写mongodb处理的整个json列的更新 .
关于jsonb的杜松子酒索引听起来很神奇 .
postgres也会在内部持久保存jsonb类型,并且基本上与数字,文本,布尔等类型匹配 .
使用jsonb也可以加入
为存储过程添加PLv8,这对于node.js开发人员来说基本上是梦想成真 .
将它存储为二进制jsonb也将删除所有空格,更改属性的顺序并使用属性的最后一次出现删除重复属性 .
除了查询jsonb列时的索引与json列对比postgres不必实际运行将每行上的文本转换为json的功能独自节省大量时间 .
hstore 更多是"wide column"存储类型,它是键值对的平面(非嵌套)字典,始终以合理有效的二进制格式(哈希表,因此名称)存储 .
json 将JSON文档存储为文本,在存储文档时执行验证,并在需要时在输出上解析它们(即访问单个字段);它应该支持整个JSON规范 . 由于存储了整个JSON文本,因此会保留其格式 .出于性能原因,
jsonb 采用快捷方式:JSON数据在输入时解析并以二进制格式存储,不保留字典中的键排序,也不是重复键 . 访问JSONB字段中的各个元素非常快,因为它不需要始终解析JSON文本 . 在输出时,重建JSON数据并丢失初始格式 .
IMO,如果您正在使用机器可读数据,没有明显的理由不使用 jsonb .
据我所知,
当前存在的
hstore(在Postgresql 9.3中)不允许将其他对象和数组嵌套为其键/值对的值 . 但是,未来的hstore补丁将允许嵌套 . 此补丁不会出现在9.4版本中,可能不会很快包含在内 .
json,因为它当前存在允许嵌套,但是基于文本,并且不允许索引,因此它是"slow"
将与9.4一起发布的
在postgresql 9.4上工作的人似乎在说新的快速jsonb类型会吸引那些选择使用像MongoDB这样的noSQL数据存储的人,但现在可以将关系数据库与可查询的非结构化数据结合在一起
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
postgresql 9.4 jsonb的基准测试似乎与MongoDB相当或在某些情况下更快
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb
8 回答
首先,hstore是一个contrib模块,它只允许存储key => value对,其中键和值只能是
text
s(但值也可以是sqlNULL
) .json
和jsonb
都允许您存储有效的JSON值(在其spec中定义) .F.ex.这些是有效的JSON表示:
null
,true
,[1,false,"string",{"foo":"bar"}]
,{"foo":"bar","baz":[null]}
-hstore
只是JSON能力的一个小子集(但如果你只需要这个子集,那就没关系) .json
和jsonb
之间的唯一区别是它们的存储:json
以纯文本格式存储,而jsonb
以某种二进制表示形式存储这有三个主要后果:
jsonb
通常比json
需要更多的磁盘空间(有时不会)jsonb
需要更多时间来构建其输入表示而不是json
json
操作比jsonb
花费的时间要多得多(每次在json
类型的值上执行某些操作时也需要进行解析)当
jsonb
可用于稳定版本时,将有两个主要用例,当您可以轻松地在它们之间进行选择时:如果您只在应用程序中使用JSON表示,PostgreSQL仅用于存储和检索此表示,您应该使用
json
.如果您对PostgreSQL中的JSON值执行了大量操作,或者在某些JSON字段上使用索引,则应使用
jsonb
.jsonb是JSON的“更好”版本 . 让我们借助一个例子来检查 .
JSON允许使用空格,这就是为什么我们可以在存储键"a"时看到空格,而JSONB则不然 .
JSON存储key的所有值 . 这就是你可以看到针对键"a"的多个值(2和1)的原因,而JSONB只是"stores"最近的值 .
JSON维护元素被插入的顺序,而JSONB维护"sorted"顺序 .
JSONB对象存储为解压缩二进制文件,而不是JSON中的"raw data",其中在检索期间不需要重新分析数据 .
jsonb也支持索引,这可能是一个显着的优势 .
通常,人们应该更喜欢JSONB,除非有非常特殊的需求,例如关于对象键排序的遗留假设 .
在上面的任何答案中都没有提到的另一个重要区别是
json
类型没有相等运算符,但jsonb
有一个 .这意味着从表中选择
json
-type和/或其他字段时不能使用DISTINCT
关键字(您可以改为使用DISTINCT ON
,但由于this等情况,并不总是这样) .Peeyush:
简短的回答是:
如果你在PostgreSQL中进行了很多JSON操作,比如排序,切片,拼接等,你应该出于速度原因使用JSONB .
如果您需要对JSON上的任意键搜索进行索引查找,那么您应该使用JSONB .
如果您没有采用上述两种方法,则应该使用JSON .
如果需要保留密钥排序,空格和重复密钥,则应使用JSON .
对于更长的答案,你需要等待我在9.4版本附近做一个完整的“HowTo”写作 .
json和jsonb(original image by PostgresProfessional)之间区别的简单解释:
json:文本存储«按原样»
jsonb:没有空格
jsonb:没有重复键,最后一键获胜
jsonb:键已排序
更多在jsonb开发人员的speech video和slide show presentation . 他们还介绍了JsQuery,pg.extension提供了强大的jsonb查询语言
我今天在pgopen基准测试比mongodb更快,我认为选择速度快了约500% . 与mongodb相比,几乎所有东西都至少快了200%,而现在的一个例外是需要完全重写mongodb处理的整个json列的更新 .
关于jsonb的杜松子酒索引听起来很神奇 .
postgres也会在内部持久保存jsonb类型,并且基本上与数字,文本,布尔等类型匹配 .
使用jsonb也可以加入
为存储过程添加PLv8,这对于node.js开发人员来说基本上是梦想成真 .
将它存储为二进制jsonb也将删除所有空格,更改属性的顺序并使用属性的最后一次出现删除重复属性 .
除了查询jsonb列时的索引与json列对比postgres不必实际运行将每行上的文本转换为json的功能独自节省大量时间 .
hstore
更多是"wide column"存储类型,它是键值对的平面(非嵌套)字典,始终以合理有效的二进制格式(哈希表,因此名称)存储 .json
将JSON文档存储为文本,在存储文档时执行验证,并在需要时在输出上解析它们(即访问单个字段);它应该支持整个JSON规范 . 由于存储了整个JSON文本,因此会保留其格式 .出于性能原因,
jsonb
采用快捷方式:JSON数据在输入时解析并以二进制格式存储,不保留字典中的键排序,也不是重复键 . 访问JSONB字段中的各个元素非常快,因为它不需要始终解析JSON文本 . 在输出时,重建JSON数据并丢失初始格式 .IMO,如果您正在使用机器可读数据,没有明显的理由不使用
jsonb
.据我所知,
当前存在的
hstore(在Postgresql 9.3中)不允许将其他对象和数组嵌套为其键/值对的值 . 但是,未来的hstore补丁将允许嵌套 . 此补丁不会出现在9.4版本中,可能不会很快包含在内 .
json,因为它当前存在允许嵌套,但是基于文本,并且不允许索引,因此它是"slow"
将与9.4一起发布的
在postgresql 9.4上工作的人似乎在说新的快速jsonb类型会吸引那些选择使用像MongoDB这样的noSQL数据存储的人,但现在可以将关系数据库与可查询的非结构化数据结合在一起
http://www.databasesoup.com/2014/02/why-hstore2jsonb-is-most-important.html
postgresql 9.4 jsonb的基准测试似乎与MongoDB相当或在某些情况下更快
http://texture.io/alphabetum/postgresql-incl-hstore-vs-mongodb