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

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

主站蜘蛛池模板: 绥中县| 泸溪县| 永州市| 水城县| 灵寿县| 手游| 建昌县| 绥阳县| 鹤山市| 白山市| 抚州市| 兴国县| 南康市| 香河县| 肇庆市| 阜新市| 施秉县| 安阳县| 尼玛县| 舒兰市| 南宫市| 涞水县| 仙居县| 东源县| 砚山县| 定西市| 富顺县| 贵南县| 敦化市| 涪陵区| 永兴县| 九台市| 额济纳旗| 康马县| 白山市| 宁国市| 绥宁县| 德保县| 封丘县| 广平县| 徐水县|