zoukankan      html  css  js  c++  java
  • json vs jsonb

    原文:

    https://cloud.tencent.com/developer/article/1496579

    JSON 与 JSONB 也是一对冤家。现在很多开源系统和开源软件都支持 JSON 与 JSONB,比如:PostgresqlMongoDB 等。

    这也导致了面试中被问到 JSON 与 JSONB 的区别时,很多人不知所措!

    今天,我们就一起来看看它们之间到底有哪些区别?

    在 stackoverflow 上有一个解释,为了方便阅读,我贴在了下面。

    首先,hstore是一个扩展模块,它允许你保存key=>values键值对,且键值都只能是texts类型(但是,值也允许sql的NULL)

    json与jsonb 允许你保存一个有效的json值(定义).

    例如,以下都是有效的json表示方式: null, true, [1, false, "string", {"foo":"bar"}], {"foo":"bar", "baz":[null]}.

    相比json, hstore只是它的一个很小的子集(但是,如果你只需要这个子集,也OK的)

    json与jsonb的区别主要是它们的存储方式:

    • json是保存为文本格式的
    • jsonb是保存为二进制格式的

    这主要有三方面的影响:

    • jsonb通常比json占用更多的磁盘空间(有些情况不是)
    • jsonbjson的写入更耗时间
    • json的操作比jsonb的操作明显更耗时间(在操作一个json类型值时需要每次都去解析)

    jsonb将在未来稳定版发行可用时,这有两个主要使用情况,你很容易在他们之间选择的:

    1. 如果你的应用只用json表示,PostgreSQL只用于保存与获取时,你应该使用json.
    2. 如果你需要在PostgreSQL中做比较多的json值的操作,或者在一些json字段上使用索引时,你应该使用jsonb

    官方文档上说:

    有两个JSON数据类型:json和jsonb。它们接受几乎 相同的值组作为输入。它们实际的主要差别是效率。

    json 数据类型存储输入文本的精确拷贝,处理函数必须在每个执行上重新解析;

    而jsonb数据以分解的二进制格式存储,这使得它由于添加了转换机制而在输入上稍微慢些,但是在处理上明显更快,因为不需要重新解析。

    jsonb也支持索引,这也是一个明显的优势。

    因为json类型存储输入文本的精确拷贝,它将保存令牌间语义上无关紧要的空格,和JSON对象中键的顺序。另外,如果值中的一个JSON对象多次包含相同的键,那么保存所有的键/值对。(处理函数将最后一个值当做操作值。)

    相比之下, jsonb不保存空格,也不保存对象键的顺序,并且不保存重复对象键。如果在输入中指定了重复的键,那么只保存最后一个值。

    json(jsonb) 的常用函数及操作符

    -> 右操作符为int: 获取JSON数组元素(索引从0开始)

    右操作符为text: 通过键获取json值

    ->> 右操作符为int: 获取JSON数组元素为text

    右操作符为text: 通过键获取json值为text

    其他的如 Postgresql 中常见的操作符:#>,#>>,@>,<@,?,?|,?& 等的用法建议参考官方文档。

    总体来说 jsonb 写入比 json 稍慢, 但检索较 json 快些,官方做过测试比较的,用的时候,根据业务来确定。

  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/14326834.html
Copyright © 2011-2022 走看看