- MongoDB進階與實戰(zhàn):微服務(wù)整合、性能優(yōu)化、架構(gòu)管理
- 唐卓章
- 1191字
- 2021-05-19 17:44:41
第3章 數(shù)據(jù)模型
3.1 BSON協(xié)議與類型
JSON與BSON是什么關(guān)系?MongoDB為什么會使用BSON?在初次接觸MongoDB時,或許有不少人對此存在疑惑。下面的內(nèi)容,將會講解其中的細節(jié)。
3.1.1 JSON標準
JSON是當今非常通用的一種跨語言Web數(shù)據(jù)交互格式,屬于ECMAScript標準規(guī)范的一個子集。JSON(JavaScript Object Notation, JS對象簡譜)即JavaScript對象表示法。顧名思義,JSON與JavaScript語言是分不開的,它是JavaScript對象的一種文本表現(xiàn)形式。
作為一種輕量級的數(shù)據(jù)交換格式,JSON的可讀性非常好,而且非常便于系統(tǒng)生成和解析,這些優(yōu)勢也讓它逐漸取代了XML標準在Web領(lǐng)域的地位,當今許多流行的Web應(yīng)用開發(fā)框架,如SpringBoot都選擇了JSON作為默認的數(shù)據(jù)編/解碼格式。
以JSON格式定義的數(shù)據(jù)形式如下:

總的來說,JSON由兩種基本結(jié)構(gòu)組成:
● 鍵值對的集合,等同于我們所說的對象、字典、哈希表(hash table)等數(shù)據(jù)結(jié)構(gòu),比如一個用戶會同時擁有名稱(name)、年齡(age)等字段信息;這個結(jié)構(gòu)還可以支持嵌套,如用戶的地址信息(address)作為子對象,地址中又可以包含郵政編碼(zcode)、詳細街道地址(street)等。
● 有序的數(shù)據(jù)列表,通常對應(yīng)于數(shù)組形式,如上述例子中的faviorites字段,表示一個用戶可以有多種偏好的標簽信息。
JSON只定義了6種數(shù)據(jù)類型,如圖3-1所示。

圖3-1 JSON數(shù)據(jù)類型
3.1.2 BSON和JSON
大多數(shù)情況下,使用JSON作為數(shù)據(jù)交互格式已經(jīng)是理想的選擇,但是JSON基于文本的解析效率并不是最好的,在某些場景下往往會考慮選擇更合適的編/解碼格式,一些做法如:
● 在微服務(wù)架構(gòu)中,使用gRPC(基于Google的Protobuf)可以獲得更好的網(wǎng)絡(luò)利用率。
● 分布式中間件、數(shù)據(jù)庫,使用私有定制的TCP數(shù)據(jù)包格式來提供高性能、低延時的計算能力。
BSON(Binary JSON)是二進制版本的JSON,其在性能方面有更優(yōu)的表現(xiàn)。BSON在許多方面和JSON保持一致,其同樣也支持內(nèi)嵌的文檔對象和數(shù)組結(jié)構(gòu)。二者最大的區(qū)別在于JSON是基于文本的,而BSON則是二進制(字節(jié)流)編/解碼的形式。除此之外,BSON還提供了一些擴展的數(shù)據(jù)類型,比如日期、二進制數(shù)據(jù)等。
為了更淺顯地表示二者的不同,可以看看下面這個簡單的JSON對象:

其對應(yīng)的BSON的格式編碼為:

BSON由10gen團隊設(shè)計并開源,目前主要用于MongoDB數(shù)據(jù)庫。
MongoDB在文檔存儲、命令協(xié)議上都采用了BSON作為編/解碼格式,主要具有如下優(yōu)勢:
● 類JSON的輕量級語義,支持簡單清晰的嵌套、數(shù)組層次結(jié)構(gòu),可以實現(xiàn)無模式(模式靈活)的文檔結(jié)構(gòu)。
● 更高效的遍歷,BSON在編碼時會記錄每個元素的長度,可以直接通過seek操作進行元素的內(nèi)容讀取,相對JSON解析來說,遍歷速度更快。
● 更豐富的數(shù)據(jù)類型,除了JSON的基本數(shù)據(jù)類型,BSON還提供了MongoDB所需的一些擴展類型,這更加方便數(shù)據(jù)的表示和操作。
在空間的使用上,BSON相比JSON并沒有明顯的優(yōu)勢。
3.1.3 BSON的數(shù)據(jù)類型
BSON的數(shù)據(jù)類型見表3-1。
表3-1 BSON的數(shù)據(jù)類型

續(xù)表

下面回顧一下本節(jié)的要點:
(1)JSON是通用的、輕量級的Web數(shù)據(jù)交換格式,支持嵌套的對象和數(shù)組結(jié)構(gòu),其本身也是無模式的。
(2)BSON是JSON的二進制版本,除了具備更高的性能,還提供了一些擴展的數(shù)據(jù)類型。
(3)MongoDB內(nèi)部使用BSON數(shù)據(jù)格式,但由于BSON與JSON非常相近,許多情況下稱MongoDB是基于JSON的說法也是合理的。
- Java逍遙游記
- scikit-learn Cookbook
- 密碼學原理與Java實現(xiàn)
- Instant Zepto.js
- Swift 3 New Features
- Easy Web Development with WaveMaker
- H5頁面設(shè)計:Mugeda版(微課版)
- Windows內(nèi)核編程
- LabVIEW虛擬儀器入門與測控應(yīng)用100例
- Django 3.0應(yīng)用開發(fā)詳解
- 零基礎(chǔ)學Python編程(少兒趣味版)
- 大數(shù)據(jù)時代的企業(yè)升級之道(全3冊)
- Kotlin進階實戰(zhàn)
- Java高手是怎樣煉成的:原理、方法與實踐
- 企業(yè)級Java現(xiàn)代化:寫給開發(fā)者的云原生簡明指南