官术网_书友最值得收藏!

第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的說法也是合理的。

主站蜘蛛池模板: 托克逊县| 敖汉旗| 双流县| 从江县| 龙门县| 任丘市| 韩城市| 察哈| 贵阳市| 太保市| 怀仁县| 迁安市| 承德市| 昌邑市| 卢湾区| 于都县| 水城县| 九江县| 北流市| 上杭县| 常州市| 长春市| 岫岩| 库伦旗| 九寨沟县| 蒙自县| 河曲县| 松潘县| 克拉玛依市| 台湾省| 邓州市| 长垣县| 新巴尔虎右旗| 阿坝| 延安市| 加查县| 繁昌县| 青海省| 呼玛县| 水富县| 华亭县|