. 面向文檔存儲 JSON風(fēng)格的文件與動態(tài)模式使MongoDB簡單而強(qiáng)大。 Schema Design:模式設(shè)計 在MongoDB中Schema的設(shè)計是非常不同于傳統(tǒng)的DBMS。然而Schema是非常重要的,并且是建立應(yīng)用程序的第一步。 在傳統(tǒng)的數(shù)據(jù)模型中,給一個實體關(guān)系模型一個獨立的用例在
.
面向文檔存儲
JSON風(fēng)格的文件與動態(tài)模式使MongoDB簡單而強(qiáng)大。
Schema Design:模式設(shè)計
在MongoDB中Schema的設(shè)計是非常不同于傳統(tǒng)的DBMS。然而Schema是非常重要的,并且是建立應(yīng)用程序的第一步。
在傳統(tǒng)的數(shù)據(jù)模型中,給一個實體關(guān)系模型一個獨立的用例在概念上是正確的,這是一個很正常的第三范式,但這通常會偏離你處于性能方面的考慮。在MongoDB中,Schema的設(shè)計不僅僅是對數(shù)據(jù)進(jìn)行建模的用例。根據(jù)最常見的用例,我們對Schema的設(shè)計進(jìn)行了優(yōu)化,這有利有弊——用例通常是高性能的。然而有一個偏見是說Schema可能使某些動態(tài)查詢相比于關(guān)系模型缺少一點優(yōu)雅。
當(dāng)我們要設(shè)計Schema時,需要考慮以下問題:
1.什么時候我們嵌入數(shù)據(jù)和鏈接(見下文)?我們在這里的決定講影響第二個問題的答案
2.我們有多少集合,它們是什么?
3.什么時候我們需要原子操作?這些操作可以執(zhí)行范圍內(nèi)的BSON文檔,但并不是所有文檔。
4.我們將創(chuàng)建什么索引使查詢和更新快?
5.我們?nèi)绾吻蟹郑渴裁词欠制I?
Embedding and Linking:嵌入和鏈接
在設(shè)計一個MongoDB Schema時一個關(guān)鍵問題是什么時候嵌入,什么時候鏈接。嵌入是嵌套對象和數(shù)組到BSON文檔中,服務(wù)器空間,鏈接是文檔之間的引用。
在MongoDB中沒有join——在1000服務(wù)器集群中做分布式j(luò)oin是很困難的。嵌入有點像“prejoined”(預(yù)連接)數(shù)據(jù)。
服務(wù)器處理在一個文檔里面的操作是很容易的,美國空間,這些操作可以相當(dāng)豐富。鏈接相比之下必須處理客戶端應(yīng)用程序,應(yīng)用程序是通過發(fā)行一個后續(xù)查詢來處理文檔。
一般來說,實體之間有“包含”關(guān)系,則應(yīng)該選擇嵌入。當(dāng)不使用連接會導(dǎo)致重復(fù)的數(shù)據(jù),那么就選擇使用鏈接。
Collections:集合
在MongoDB中集合類似于關(guān)系數(shù)據(jù)庫中的表,香港空間,每一個集合包含文檔,正如上面提到的這些文件可以相當(dāng)豐富。在一個集合文檔內(nèi)字段是沒有顯式聲明。然而來自于Schema設(shè)計師的一個關(guān)于那些字段將會是什么的概念,并且文檔在集合內(nèi)是怎樣被結(jié)構(gòu)化的。MongoDB不需要集合內(nèi)的文檔有相同的結(jié)構(gòu),然而在實踐中大多數(shù)集合都是高度同質(zhì)的。只要我們愿意我們就可以避免這些,例如當(dāng)添加一個新字段,在這種情況一個“alter table”風(fēng)格操作不是必要的。
Atomic Operations:原子操作
有些問題需要能夠執(zhí)行原子操作。例如,簡單地增加計數(shù)器一個需要的原子性操作的案例。MongoDB還可以執(zhí)行更復(fù)雜的操作,如下面所示的偽代碼:
atomically { if( doc.credits > 5 ) { doc.credits -= 5; doc.debits += 5; } }
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com