1. 程式人生 > >mongodb 3.2 實戰(一)非關係型資料庫設計,如何進行mongo的資料庫設計?

mongodb 3.2 實戰(一)非關係型資料庫設計,如何進行mongo的資料庫設計?

mongo 於2015,12,8 正式釋出了3.2的穩定版,這次重大的更新後,主要包括以下幾個比較令人興奮的點。

這裡寫圖片描述

1.wiredtiger 引擎

在3.0釋出時,wiredtiger作為資料引擎之一。3.2之後wiredtiger作為建立資料庫的預設資料庫,官方的文件中介紹wiredtiger引擎將提高7-10倍的的寫效率。意味著更少的硬體支出也能夠支援很大的併發操作和密集型操作。
附:所有的mongo引擎:
這裡寫圖片描述

2.減少80%的物理儲存

支援本機的壓縮。可根據應用需求來選擇演算法進行壓縮,來提高效能和儲存效率。

3.減少95%的維護量

主要體現在

  • 減少了複製集故障切換時間
  • 文件的驗證

    為了在一個新的集合上指定文件驗證,在db.createCollection()方法使用新的validator選項。為了新增文件驗證到一個存在的集合。為了檢視一個集合的驗證規則,使用db.getCollectionInfos()方法。

以上主要介紹了3.2在更新中的一些特性,說了這麼多,下面主要想的是來介紹一下mongo資料庫設計

一、為何選擇mongo?

mysql與mongo相比,事務與約束性更強。在處理較為價值較高的資料時,關係型資料庫有它天然的優勢,然而任何一種業務情況下,關係型資料庫都不是銀彈策略。任何來拋開業務來談論技術,都是在耍流氓。那麼在什麼情況下去選擇mongo呢?

  • 資料價值不是重點
  • 屬性查詢需求較少
  • 資料之間約束較少

二、mongo的資料庫設計方案

1.嵌入式

 嵌入式的設計類似於如下的設計
{ 
    "_id" : "2f1a18a6c11b47229ec37f23c97454de", 
    "_class" : "yingding.edu.facade.user.entity.User", 
    "userName" : "U18310300203", 
    "phone" : "18310300203", 
    "userPwd" : "123456", 
    "createDate" : "2016-02-02 15:21:54:117"
, "role" : [ { "_id" : "745fed9eb9ec42dc843c3d7f1f44243a", "roleName" : "遊客", "reMark" : "使用者註冊,預設角色為遊客!", "domainId" : "12121", "createDate" : "2016-02-02 15:21:56:441", "updateDate" : "2016-02-02 15:21:55:172" } ], "dataComplete" : "0", "isExist" : "0", "classInfoId" : "", "updateDate" : "2016-02-02 15:21:53:370" }

如上,在user物件中籤入了role實體,這樣在查詢時能夠直接通過查詢到user物件來直接獲取user物件的屬性以及角色資訊。

這樣來做的目的摒棄了之前在關係型資料庫中的連線查詢,由於mongo資料庫本身的記憶體機制,進一步減少了磁碟IO帶來的損耗。

對應在關係型資料庫中,能夠解決這種的many-to-many的物理資料庫設計問題。

2.引用式

與巢狀式的資料庫設計,相對的當然是引用式設計。引用式設計,本質上其實還是在遵循關係型資料的設計方式來進行。這種的設計方式,其實是在某種意義上是拋棄了mongo這種bjon的儲存方式的。但是在現實的資料庫設計過程中,我們無法去規避這種設計方案來去配合業務。

如下:

{ 
    "_id" : "df170e16629f442a923e08336a23de88", 
    "_class" : "yingding.edu.facade.classinfo.entity.ClassInfo", 
    "className" : "1班", 
    "gradeName" : "高一", 
    "schoolInfoId" : "ec4fac512af84299b870bbb8a21d282c", 
    "createDate" : "2016-02-17 16:50:21:977", 
    "updateDate" : "2016-02-17 16:50:21:977"
}

在class集合中引用了關於學校的id。這樣的情況下,其實是極不推薦的。因為在mongo中原子性的操作是位於document級別的,相比關係型資料庫的連線查詢,mongo操作起來更為的繁瑣。