文件模型(JSON)使用介紹

SequoiaDB發表於2016-11-02

一、背景

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

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

二、產品介紹

SequoiaDB是新一代分散式文件類資料庫,其資料模型為文件模型(JSON),而非傳統的關係型資料模型。關係模型以二維表來表示實體與實體之間的聯絡,在資料建模時需要對資料物件進行拆分,再將各自的資訊存到對應的表裡,在需要時再將各個表連線起來。而巨杉資料庫以一個文件為單位進行儲存,支援陣列和文件巢狀,關係模型中需要拆分的資訊可以直接用一個文件來表示。

JSON(JavaScript Object Notation)是一種輕量級的資料交換格式,它基於ECMAScript的一個子集,為純文字格式,支援巢狀結構與陣列。

JSON 具有如下形式:

1、物件是一個無序的“鍵值對”集合,以“{”(左大括號)開始,“}”(右大括號)結束。每一個元素名後跟一個“:”(冒號);而元素之間使用“,”(逗號)分隔; enter image description here

2、陣列是值的有序集合,以“[”(左中括號)開始,“]”(右中括號)結束。值之間使用“,”(逗號)分隔;

enter image description here

3、值可以為由雙引號包裹的字串,數值,物件,陣列,true,false,null,以及 SequoiaDB 資料庫特有的資料結構(例如日期,時間等)組成。 enter image description here

三、場景設計

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

購物車是網上購物時存放感興趣商品的虛擬籃子,開啟購物車,通常希望看到各個商品的概要資訊,如所屬店鋪名稱、商品名稱、價格、數量等,若商品是服裝,可能還需要展示尺碼、顏色等屬性資訊。 當我們用文件模型來表達購物車應用時,一種參考資料模型如下所示:

{
  "_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 
} )

修改前後的效果為:

enter image description here

注意,這裡在使用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程式碼來實現。

enter image description here

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

五、結論

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

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

SequoiaDB巨杉資料庫技術部落格

SequoiaDB巨杉資料庫社群

相關文章