標籤:

文檔模型(JSON)使用介紹

一、背景

E.F.Codd在1970年首次提出了資料庫系統的關係模型,從此開創了資料庫關係方法和關係數據理論的研究,為資料庫技術奠定了理論基礎,資料庫技術也開始蓬勃發展。而隨著幾大資料庫廠商陸續發布的商業資料庫管理系統幾乎都支持關係數據模型,資料庫技術逐漸統一到以關係型資料庫為主導。

2001年後,互聯網技術迅速發展,數據量迅速膨脹並並大,人類逐步進入大數據時代。大數據給傳統的數據管理方式帶來了嚴峻的挑戰,關係型資料庫在容量,性能,成本等多方面都難以滿足大數據管理的需求。NoSQL資料庫通過折中關係型資料庫嚴格的數據一致性管理,在可擴展性、模型靈活性、經濟性和訪問性等方面獲得了很大的優勢,可以更好地適應大數據應用的需求,成為大數據時代最重要的數據管理技術。

二、產品介紹

SequoiaDB是新一代分散式文檔類資料庫,其數據模型為文檔模型(JSON),而非傳統的關係型數據模型。關係模型以二維表來表示實體與實體之間的聯繫,在數據建模時需要對數據對象進行拆分,再將各自的信息存到對應的表裡,在需要時再將各個表連接起來。而巨杉資料庫以一個文檔為單位進行存儲,支持數組和文檔嵌套,關係模型中需要拆分的信息可以直接用一個文檔來表示。

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它基於ECMAScript的一個子集,為純文本格式,支持嵌套結構與數組。

JSON 具有如下形式:

1、對象是一個無序的「鍵值對」集合,以「{」(左大括弧)開始,「}」(右大括弧)結束。每一個元素名後跟一個「:」(冒號);而元素之間使用「,」(逗號)分隔;

2、數組是值的有序集合,以「[」(左中括弧)開始,「]」(右中括弧)結束。值之間使用「,」(逗號)分隔;

3、值可以為由雙引號包裹的字元串,數值,對象,數組,true,false,null,以及 SequoiaDB 資料庫特有的數據結構(例如日期,時間等)組成。

三、場景設計

文檔模型應用場景非常廣泛,這裡以一個大家比較熟悉且經常會用到的一個場景——購物車為例,介紹文檔模型的使用。

購物車是網上購物時存放感興趣商品的虛擬籃子,打開購物車,通常希望看到各個商品的概要信息,如所屬店鋪名稱、商品名稱、價格、數量等,若商品是服裝,可能還需要展示尺碼、顏色等屬性信息。

當我們用文檔模型來表達購物車應用時,一種參考數據模型如下所示:

{ "_id": { "$oid": "57b44b2b2b57085321000001" }, "items": [ { "shopid": 8224, "picture": "http://www.sequoiadb.com/product.jpg", "amount": 1, "price": "117.59", "itemname": "Coffee", "itemid": 194987 }, { "shopid": 9291, "attribute": [ { "color": "Blue", "size": "M" }, { "color": "Pink", "size": "M" } ], "picture": "http://www.sequoiadb.com/product.jpg", "amount": 2, "price": "17.63", "itemname": "T-shirt", "itemid": 543514 } ], "isactive": true, "uid": 123456}

每個用戶都對應一個文檔,文檔中由用戶標識、狀態及購物車物品幾個欄位,其中購物車是一個嵌套文檔,裡面包含對應用戶購物車中的商品。每個商品都具有名稱、價格、數量等信息,還可以根據需要為不同種類商品添加不同欄位,比如這裡的「attribute」欄位,用於存放服裝類商品的屬性信息,如顏色、尺碼,當然,同類商品可以具有不同個數、不同內容的屬性信息,可以非常靈活地處理。

四、JSON API實現

對於一個購物車,常見的操作有:增加商品、刪除商品、增加商品數量、修改商品屬性、商品統計。在文檔模型下,我們提供與之對應的一套完善的API來表示跟購物車相關的一系列操作。

4.1 增加商品

當我們希望在購物車中增加一本價格為99元的書時,可以使用如下的update語句:

db.mall.cart.update({ $push:{ items:{ shopid:6666, amount:1, price:"99.00", itemname:"Book", itemid:206053 } }},{ uid:123456})

其中,{uid:123456}為更新的匹配條件,表示用戶標識為123456的用戶,$push表示在數組末尾增加一個元素。$push的語法為:

{ $push:{ <欄位名1>:<值1>, <欄位名2>:<值2>, ... }}

$push 將給定數值(<值1>)插入到目標數組(<欄位名1>)中,操作對象必須為數組類型的欄位。

4.2 刪除商品

如果希望從購物車中刪除特定的商品,也可以使用update語句。與增加商品使用更新符$push不同的是,刪除購物車中商品使用的是$pull更新符,其對應語句為:

db.mall.cart.update({ $pull:{ items:{ shopid:6666, amount:1, price:"99.00", itemname:"Book", itemid:206053 } }},{ uid:123456})

同樣的,{uid:123456}為更新的匹配條件,表示用戶標識為123456的用戶。$pull表示從數組中清除匹配的數組元素。

$pull的語法為:

{ $pull: { <欄位名1>:<值1>, <欄位名2>:<值2>, ... }}

$pull清除指定數組對象(<欄位名1>,<欄位名2>,...)的指定值(<值1>,<值2>,...)。操作對象必須為數組類型的欄位。如果記錄中不存在指定的數組對象,跳過不做任何操作;如果指定的值不存在數組對象中,也不做任何操作。

另外,巨杉資料庫支持$replace語法,在不改變_id(由資料庫自動生成的唯一標識)的情況下,改變文檔內容,對應的語句為:

db.mall.cart.update( { $replace:{ uid:123456, items:[{ itemid:5856, itemname:"Cup", amount:1, price:"69.00", shopid:8224 } ] }}, { uid:123456 } )

修改前後的效果為:

注意,這裡在使用find時使用了兩個JSON對象作為參數,這是巨杉資料庫find函數的特殊語法,前一個JSON對象表示的是查詢條件,代表用戶標識uid為123456,第二個JSON對象表示的是selector,它控制返回結果的欄位,可以理解為標準SQL語法中select語句後面的欄位名,表示返回結果中只需要包含select後面的指定的欄位。

$replace語法為:{ $replace:{ <欄位名1>:<值1>, <欄位名2>:<值2>, ... }}

$replace操作是將文檔全部替換成"{<欄位名1>:<值1>,<欄位名2>:<值2>,...}"。除了保留原始的 _id 之外,原始文檔的內容會全部清空,並替換成"{<欄位名1>:<值1>,<欄位名2>:<值2>,...}"。

4.3 增加商品數量

當我們需要修改購物車中某一商品的數量時,可以使用update語句搭配特定的更新符來完成。實現語句為:

db.mall.cart.update({ $inc:{ "items.0.amount":1 }},{ "uid":123456})

這裡使用了更新符$inc,表示給購物車中第一個商品的amount增加1,注意這裡表示購物車中第一個商品的語法:items.0.amount,其中,0表示購物車中商品的序數,數組元素從0開始計數。

$inc的語法為:

{ $inc:{ <欄位名1>:<值1>, <欄位名2>:<值2>, ... }}

$inc 操作是給指定「<欄位名>」增加指定的「<值>」。修改購物車中商品數量除了可以通過$inc來實現外,還可以使用$set來做,$set語法為:

{ $set:{ <欄位名1>:<值1>, <欄位名2>:<值2>, ... }}

$set操作是將指定的「<欄位名>」更新為指定的「<值>」。

4.4 商品統計

對於某一個用戶的購物車中的商品,如何獲取購物車中的商品總數呢?或者當買家在準備結賬時選擇了多個商品時,如何在資料庫中獲取所選商品的數量和總價格呢?要獲取這些信息,需要藉助JavaScript代碼來實現。

通過這種方式,可以得到購物車中每一件商品的單價、數量等信息,根據不同的應用需求,可以在資料庫中方便的查詢商品的信息並進行處理。

五、結論

SequoiaDB採用JSON定義的數據模型(對象存儲),將程序中的對象以原生的方式保存在資料庫中,並且可以對其中而已屬性或子對象進行檢索匹配,可以大幅度弱化複雜的關係模型,加快應用的開發速度,並減少系統的運維成本。

SequoiaDB巨杉資料庫 2.6 最新版下載

SequoiaDB巨杉資料庫技術博客

SequoiaDB巨杉資料庫社區
推薦閱讀:

從零開始的 JSON 庫教程(四):Unicode 解答篇
SF 講堂推薦「JSON的SOA解決方案及其在雲服務API管理中的應用」要開播啦
json 在 Python 爬蟲的應用
從零開始的 JSON 庫教程(六):解析對象解答篇
用EBNFParser解析JSON和Xml

TAG:JSON | 資料庫 | SQL |