第3章 数据模型
3.1 BSON协议与类型
JSON与BSON是什么关系?MongoDB为什么会使用BSON?在初次接触MongoDB时,或许有不少人对此存在疑惑。下面的内容,将会讲解其中的细节。
3.1.1 JSON标准
JSON是当今非常通用的一种跨语言Web数据交互格式,属于ECMAScript标准规范的一个子集。JSON(JavaScript Object Notation, JS对象简谱)即JavaScript对象表示法。顾名思义,JSON与JavaScript语言是分不开的,它是JavaScript对象的一种文本表现形式。
作为一种轻量级的数据交换格式,JSON的可读性非常好,而且非常便于系统生成和解析,这些优势也让它逐渐取代了XML标准在Web领域的地位,当今许多流行的Web应用开发框架,如SpringBoot都选择了JSON作为默认的数据编/解码格式。
以JSON格式定义的数据形式如下:
总的来说,JSON由两种基本结构组成:
● 键值对的集合,等同于我们所说的对象、字典、哈希表(hash table)等数据结构,比如一个用户会同时拥有名称(name)、年龄(age)等字段信息;这个结构还可以支持嵌套,如用户的地址信息(address)作为子对象,地址中又可以包含邮政编码(zcode)、详细街道地址(street)等。
● 有序的数据列表,通常对应于数组形式,如上述例子中的faviorites字段,表示一个用户可以有多种偏好的标签信息。
JSON只定义了6种数据类型,如图3-1所示。
图3-1 JSON数据类型
3.1.2 BSON和JSON
大多数情况下,使用JSON作为数据交互格式已经是理想的选择,但是JSON基于文本的解析效率并不是最好的,在某些场景下往往会考虑选择更合适的编/解码格式,一些做法如:
● 在微服务架构中,使用gRPC(基于Google的Protobuf)可以获得更好的网络利用率。
● 分布式中间件、数据库,使用私有定制的TCP数据包格式来提供高性能、低延时的计算能力。
BSON(Binary JSON)是二进制版本的JSON,其在性能方面有更优的表现。BSON在许多方面和JSON保持一致,其同样也支持内嵌的文档对象和数组结构。二者最大的区别在于JSON是基于文本的,而BSON则是二进制(字节流)编/解码的形式。除此之外,BSON还提供了一些扩展的数据类型,比如日期、二进制数据等。
为了更浅显地表示二者的不同,可以看看下面这个简单的JSON对象:
其对应的BSON的格式编码为:
BSON由10gen团队设计并开源,目前主要用于MongoDB数据库。
MongoDB在文档存储、命令协议上都采用了BSON作为编/解码格式,主要具有如下优势:
● 类JSON的轻量级语义,支持简单清晰的嵌套、数组层次结构,可以实现无模式(模式灵活)的文档结构。
● 更高效的遍历,BSON在编码时会记录每个元素的长度,可以直接通过seek操作进行元素的内容读取,相对JSON解析来说,遍历速度更快。
● 更丰富的数据类型,除了JSON的基本数据类型,BSON还提供了MongoDB所需的一些扩展类型,这更加方便数据的表示和操作。
在空间的使用上,BSON相比JSON并没有明显的优势。
3.1.3 BSON的数据类型
BSON的数据类型见表3-1。
表3-1 BSON的数据类型
续表
下面回顾一下本节的要点:
(1)JSON是通用的、轻量级的Web数据交换格式,支持嵌套的对象和数组结构,其本身也是无模式的。
(2)BSON是JSON的二进制版本,除了具备更高的性能,还提供了一些扩展的数据类型。
(3)MongoDB内部使用BSON数据格式,但由于BSON与JSON非常相近,许多情况下称MongoDB是基于JSON的说法也是合理的。