从JSON进化到BSON

自从MEAN引导的JSON数据格式取代传统JAVA推崇的XML以后, json的发展却停滞不前了, 当然这是好事, 因为稳定的结构是不需要向下兼容的, 但是json之所以轻便简单就是源于它的类型, 额, 确切说json就是一个字符串, 是文本, 可以存储在文件中或者数据库字段里.

要知道, 在整个宇宙都即将面向对象的年代, 数据类型(包括媒体类型)是多样化的, 而通常媒体类型和数据类型是隔离的, 以为多媒体包括什么文本啦, 图像啦, 图片, 音视频等等, 而数据类型指的是数字, 字符串, 数组, 对象, 二进制等等, 这两者是无法相通的, 比如这些数据结构是无法直接存储在文件里, 也无法直接传输在http的body中, 但有没有发现, 有一个特殊的类型是两者的唯一交集, 那即是string(文本,字符串), string是万能的, 那里都支持处理, 存储, 传输string类型. 但是现在的需求是多样化的, json这种基于string的数据结构满足不了一些高级需求, 于是乎json的扩展---bson诞生了 .

  bson是由10gen开发的一个数据格式,目前主要用于mongoDB中,是mongoDB的数据存储格式。bson基于json格式,选择json进行改造的原因主要是json的通用性及json的schemaless的特性。

  bson主要会实现以下三点目标:

1.更快的遍历速度

  对json格式来说,太大的json结构会导致数据遍历非常慢。在json中,要跳过一个文档进行数据读取,需要对此文档进行扫描才行,需要进行麻烦的数据结构匹配,比如括号的匹配。   而bson对json的一大改进就是,它会将json的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取了。

2.操作更简易

  对json来说,数据存储是无类型的,比如你要修改基本一个值,从9到10,由于从一个字符变成了两个,所以可能其后面的所有内容都需要往后移一位才可以。   而使用bson,你可以指定这个列为数字列,那么无论数字从9长到10还是100,我们都只是在存储数字的那一位上进行修改,不会导致数据总长变大。   当然,在mongoDB中,如果数字从整形增大到长整型,还是会导致数据总长变大的。

3.增加了额外的数据类型

  json是一个很方便的数据交换格式,但是其类型比较有限。   bson在其基础上增加了“byte array”数据类型。这使得二进制的存储不再需要先base64转换后再存成json,大大减少了计算开销和数据大小。   当然,在有的时候,bson相对json来说也并没有空间上的优势,比如对{“field”:7},在json的存储上7只使用了一个字节,而如果用bson,那就是至少4个字节(32位)

  目前在10gen的努力下,bson已经有了针对多种语言的编码解码包。并且都是Apache 2 license下开源的。并且还在随着mongoDB进一步地发展。

总上所述:

数据结构:   json是像字符串一样存储的,bson是按结构存储的(像数组 或者说struct)

存储空间   bson>json

操作速度   bson>json。比如,遍历查找:json需要扫字符串,而bson可以直接定位

修改:   json也要大动大移,bson就不需要。

原文发布于微信公众号 - WebHub(myWebHub)

原文发表时间:2018-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青蛙要fly的专栏

Android技能树 — 数组,链表,散列表基础小结

现在安卓面试,对于数据结构的问题也越来越多了,要求也越来越多,所以我对于数据结构只能慢慢补起来了。(灬ꈍ ꈍ灬)

1224
来自专栏Crossin的编程教室

【Python 第51课】 and-or技巧

今天介绍一个python中的小技巧:and-or 看下面这段代码: a = "heaven" b = "hell" c = True and a or b p...

2829
来自专栏ml

caffe中是如何运用protobuf构建神经网络的?

2065
来自专栏青玉伏案

代码重构(五):继承关系重构规则

陆陆续续的发表了多篇关于重构的文章了,还是那句话,重构是一个项目迭代开发中必不可少的一个阶段。其实重构伴随着你的项目的整个阶段。在前几篇关于重构的文章中我们谈到...

2066
来自专栏Hongten

java中char类型和int类型相加结果是char类型还是int类型?

当然,首先,我们可以肯定的是,这两个是可以相加的。其次,我们要知道他们都是基础类型。最后,我们要明白一点:

3112
来自专栏java学习

java每日一练(2017/8/24)

最新通知 ●回复"每日一练"获取以前的题目! ●【新】Android视频更新了!(回复【安卓视频】获取下载链接) ●【新】Ajax知识点视频更新了!(回复【学习...

36916
来自专栏java一日一条

10个实用的但偏执的Java编程技术

这就是为什么我们要采用“防御性编程”,即一些偏执习惯的原因。下面是我个人认为的10个最有用但偏执的Java编程技术。一起来看一看吧:

882
来自专栏java一日一条

10个实用的但偏执的Java编程技术

在沉浸于编码一段时间以后(比如说我已经投入近20年左右的时间在程序上了),你会渐渐对这些东西习以为常。因为,你知道的……

672
来自专栏aCloudDeveloper

python学习总结

最近经学长介绍学习python,为研究生做研究做准备,python对于科学计算有着很高的效率,对于科研人员当然是有着很强的诱惑,虽然我还没真正用它,但从整个学习...

2405
来自专栏coding for love

JS进阶系列01-JS的弱类型和动态类型

首先,我们要弄清楚编程语言的两组划分,即弱类型和强类型,动态类型和静态类型。下面有一幅图,非常详细地说明了它们各自的定义和区别。

1203

扫码关注云+社区

领取腾讯云代金券