MongoDB學(xué)習(xí)筆記(二)

MongoDB的模型設(shè)計(jì)方法論

雖然說mongoDB不像傳統(tǒng)的關(guān)系型數(shù)據(jù)庫趾牧,沒有固定的schema,但是在項(xiàng)目中實(shí)際運(yùn)用時(shí)果善,還是需要進(jìn)行一定程度的模型設(shè)計(jì)都办,一般來說模型設(shè)計(jì)分為三步,即概念模型(描述系統(tǒng)要管理的對(duì)象)镜会,邏輯模型(列出所有對(duì)象的所有屬性以及對(duì)象之間的關(guān)系)和物理模型(數(shù)據(jù)庫表的物理結(jié)構(gòu))檬寂,mongoDB的模型設(shè)計(jì)只需要到邏輯模型就可以了。

在進(jìn)行mongoDB模型設(shè)計(jì)的時(shí)候可以按照三步來戳表,首先是基礎(chǔ)設(shè)計(jì)桶至,將即邏輯模型落地成一個(gè)基本的文檔模型;然后是第二步工況細(xì)化匾旭,根據(jù)應(yīng)用中的實(shí)際使用來進(jìn)行模型的優(yōu)化镣屹,比如一個(gè)文檔中的一個(gè)數(shù)組字段存的值是通用的,并且需要經(jīng)常進(jìn)行變更季率,這樣一次變更就需要對(duì)多個(gè)文檔進(jìn)行變更(比如文檔中保存多對(duì)多的分組信息野瘦,而分組名變化時(shí)該分組下的所有文檔都需要更新),這時(shí)候就可以把數(shù)組中存儲(chǔ)的信息改為引用以提高更新效率;第三步就是模式套用鞭光,即套用一些已有的經(jīng)典設(shè)計(jì)模式以提高模型查詢效率吏廉。

經(jīng)典模式舉例

1.一個(gè)大文檔,有很多字段惰许,每個(gè)字段都需要索引席覆,導(dǎo)致索引很多寫入效率緩慢。此時(shí)可以用列轉(zhuǎn)行的模式汹买。比如一個(gè)商品要記錄每個(gè)地區(qū)的價(jià)格佩伤,開始的結(jié)構(gòu)可能是:

{price_sc:123,price_hb:222,price_gz:342}

列轉(zhuǎn)行后的模型變?yōu)椋?/p>

{price_info:[{area:"sc",price:123},{area:"hb",price:222},{area:"gz",price:342}]}

2.靈活模型由于可以每個(gè)應(yīng)用版本自由得增減文檔字段,為了更好進(jìn)行管理就可以增加一個(gè)版本字段晦毙,以識(shí)別每個(gè)文檔所處的版本

3.對(duì)于需要頻繁寫入但又對(duì)數(shù)據(jù)準(zhǔn)確性要求不高的數(shù)據(jù)可以使用近似計(jì)算來提高效率生巡,比如如果需要進(jìn)行某個(gè)按鈕點(diǎn)擊次數(shù)的統(tǒng)計(jì)但又并不需要非常精確的數(shù)據(jù),就可以使用if(rand(10)=0) count+=10這樣的方式進(jìn)行近似計(jì)算

4.如果有需要頻繁進(jìn)行聚合查詢的數(shù)據(jù)见妒,而由于數(shù)據(jù)量大聚合操作很耗時(shí)孤荣,就可以進(jìn)行預(yù)聚合的模式,即保存一個(gè)聚合字段须揣,每次更新數(shù)據(jù)的時(shí)候也更新聚合字段盐股,這樣在查詢時(shí)就不需要再進(jìn)行聚合操作了。當(dāng)然這樣也會(huì)增加寫入數(shù)據(jù)的消耗耻卡,所以適用聚合查詢很多且確實(shí)是主要性能瓶頸的情況疯汁。

MongoDB寫事務(wù)

mongo的寫事務(wù)是通過配置writeConcern參數(shù)來實(shí)現(xiàn)的,writeConcern有幾個(gè)可以配置的值:0卵酪,1-集群最大節(jié)點(diǎn)數(shù)或者majority幌蚊,如果配置為0意思是客戶端只發(fā)起寫操作并不關(guān)心寫操作是否成功,這種配置下數(shù)據(jù)的安全性最低溃卡,不推薦配置成該值霹肝,如果配置為1-集群最大節(jié)點(diǎn)數(shù)(n)的話,就是至少保證有n個(gè)節(jié)點(diǎn)寫入成功才返回客戶端成功塑煎,意思是如果配置成集群節(jié)點(diǎn)數(shù)的話,一次寫入會(huì)在數(shù)據(jù)同步到集群所有節(jié)點(diǎn)上之后才算成功臭蚁,這樣固然數(shù)據(jù)是最安全的最铁,但是會(huì)大大影響寫入的效率,所以一般也不建議這樣使用垮兑。writeConcern最常見的配置就是majority冷尉,意為大多數(shù)節(jié)點(diǎn)寫入成功即返回成功,比如集群中有5個(gè)節(jié)點(diǎn)系枪,那么有3個(gè)節(jié)點(diǎn)寫入成功即會(huì)返回客戶端成功寫入雀哨,這種配置兼顧了安全性和寫入性能的保證。

MongoDB讀事務(wù)

MongoDB的讀事務(wù)主要涉及到兩個(gè)參數(shù),第一個(gè)是readPreference雾棺,另一個(gè)是readConcern

1.readPreference

readPreference的配置主要作用是配置讀操作時(shí)更加傾向讀取的節(jié)點(diǎn)膊夹。可能取值有primary捌浩,primaryPreferred放刨,secondary,secondaryPreferred尸饺,nearest进统。primary為只讀取主節(jié)點(diǎn);primaryPreferred為優(yōu)先讀取主節(jié)點(diǎn)浪听,主節(jié)點(diǎn)不可用時(shí)讀取子節(jié)點(diǎn)螟碎;secondary為只讀取子節(jié)點(diǎn);secondaryPreferred為優(yōu)先讀取子節(jié)點(diǎn)迹栓,子節(jié)點(diǎn)不可用時(shí)讀取主節(jié)點(diǎn)掉分;nearest為讀取最近的節(jié)點(diǎn),主要用于數(shù)據(jù)跨區(qū)域存儲(chǔ)迈螟。

2.readConcern

readConcern的主要作用就是用于讀取時(shí)判斷節(jié)點(diǎn)上哪些數(shù)據(jù)是可讀的叉抡,類似于關(guān)系型數(shù)據(jù)庫中的隔離級(jí)別,可選值有available答毫,local褥民,majoyrity,linearizable和snapshot洗搂。available和local在復(fù)制集中的作用大致上都是一樣的消返,即都是讀屬于當(dāng)前分片的數(shù)據(jù);majoyrity意思是讀已經(jīng)被大多數(shù)分片保存到的數(shù)據(jù)耘拇,這個(gè)類似于關(guān)系型數(shù)據(jù)庫隔離級(jí)別中的讀已提交撵颊,在讀寫分離的場景中可能會(huì)遇到往主節(jié)點(diǎn)中完成了寫入數(shù)據(jù)之后在子節(jié)點(diǎn)中無法馬上找到該數(shù)據(jù),這個(gè)時(shí)候可以通過配置writeConcern和readConcern都為majoyrity來解決這個(gè)問題惫叛;linearizable和majoyrity的不同是它會(huì)保證操作的線性順序倡勇,及寫操作之后的讀一定能讀到寫操作寫入的數(shù)據(jù),比如有這樣的情況嘉涌,一個(gè)主節(jié)點(diǎn)在集群中與其他節(jié)點(diǎn)失聯(lián)妻熊,而其他節(jié)點(diǎn)此時(shí)已經(jīng)重新選出了一個(gè)主節(jié)點(diǎn),但失聯(lián)的主節(jié)點(diǎn)并沒有意識(shí)到出現(xiàn)了問題依然在接受請(qǐng)求仑最,則此時(shí)在新的主節(jié)點(diǎn)中寫入的數(shù)據(jù)在失聯(lián)的主節(jié)點(diǎn)中是查詢不到的扔役,而如果配置了linearizable,讀操作會(huì)在保證讀的節(jié)點(diǎn)與其他節(jié)點(diǎn)的連接性警医。snapshot則是讀取最近的一次數(shù)據(jù)庫快照亿胸,類似于可重復(fù)讀坯钦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侈玄,隨后出現(xiàn)的幾起案子婉刀,更是在濱河造成了極大的恐慌,老刑警劉巖拗馒,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件路星,死亡現(xiàn)場離奇詭異,居然都是意外死亡诱桂,警方通過查閱死者的電腦和手機(jī)洋丐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挥等,“玉大人友绝,你說我怎么就攤上這事「尉ⅲ” “怎么了迁客?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辞槐。 經(jīng)常有香客問我掷漱,道長,這世上最難降的妖魔是什么榄檬? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任卜范,我火速辦了婚禮,結(jié)果婚禮上鹿榜,老公的妹妹穿的比我還像新娘海雪。我一直安慰自己,他們只是感情好舱殿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布奥裸。 她就那樣靜靜地躺著,像睡著了一般沪袭。 火紅的嫁衣襯著肌膚如雪湾宙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天冈绊,我揣著相機(jī)與錄音创倔,去河邊找鬼。 笑死焚碌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的霸妹。 我是一名探鬼主播十电,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鹃骂?” 一聲冷哼從身側(cè)響起台盯,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏线,沒想到半個(gè)月后静盅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寝殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年蒿叠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣常。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡市咽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵蚊,到底是詐尸還是另有隱情施绎,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布贞绳,位于F島的核電站谷醉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏冈闭。R本人自食惡果不足惜俱尼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒秘。 院中可真熱鬧号显,春花似錦、人聲如沸躺酒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹应。三九已至揽碘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間园匹,已是汗流浹背雳刺。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裸违,地道東北人掖桦。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像供汛,于是被迫代替她去往敵國和親枪汪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涌穆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355