本文由IT大咖說(shuō)整理自MongoDB大中華區(qū)高級(jí)顧問(wèn) 張耀星先生 在 MongoDB中文社區(qū)深圳用戶組大會(huì)?上的演講究飞。你知道MongoDB嗎?它到底是怎樣的一個(gè)軟件肺魁,和傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)有什么區(qū)別产场,在實(shí)際應(yīng)用中又能做些什么事。本文帶你走近MongoDB瑟押,了解它從設(shè)計(jì)到實(shí)現(xiàn)的全過(guò)程。
本文3216字狸吞,閱讀時(shí)間預(yù)計(jì)15分鐘勉耀。
嘉賓演講視頻回顧及PPT:鏈接
張耀星,MongoDB大中華區(qū)高級(jí)顧問(wèn)蹋偏,加入IT行業(yè)10余年便斥,從事過(guò)電商,手游及各類網(wǎng)站的設(shè)計(jì)制作工作威始。曾擔(dān)任跨境電商網(wǎng)站dx.com架構(gòu)師枢纠,Universal Orlando Resort前端總工程師等。現(xiàn)就職于MongoDB為國(guó)內(nèi)各大企業(yè)提供MongoDB咨詢服務(wù)黎棠。
大家好晋渺,我是中文社區(qū)的張耀星,平時(shí)在社區(qū)的微信群里跟大家互動(dòng)比較多脓斩。今天在線下跟大家做一些交流木西。今天我演講的內(nèi)容是關(guān)于MongoDB的應(yīng)用,如何從設(shè)計(jì)到實(shí)現(xiàn)的全過(guò)程随静,該做什么事情八千,要避免怎樣的問(wèn)題,做一個(gè)經(jīng)驗(yàn)上的介紹燎猛。
MongoDB的哲學(xué)
在座的朋友可能有些去參加過(guò)MongoDB的考試恋捆。目前在中國(guó)一共只有不到20位朋友通過(guò)了這個(gè)考試。在這個(gè)考試中有一個(gè)章節(jié)重绷,叫做MongoDB的哲學(xué)沸停。它需要我們?nèi)チ私釳ongoDB背后設(shè)計(jì)的思想。
大家第一次看到MongoDB的時(shí)候肯定會(huì)有一些疑問(wèn)昭卓,這是什么東西愤钾?和普通的數(shù)據(jù)庫(kù)有什么區(qū)別?到底能干什么候醒?
我們可以去網(wǎng)上看看用過(guò)的人怎么說(shuō)绰垂。把大家的觀點(diǎn)都看過(guò)之后,才能對(duì)MongoDB有一個(gè)更深入的了解火焰。了解之后我們會(huì)發(fā)現(xiàn),其實(shí)MongoDB和關(guān)系數(shù)據(jù)庫(kù)最本質(zhì)的一個(gè)區(qū)別是胧沫,關(guān)系數(shù)據(jù)庫(kù)是關(guān)系型的昌简,而MongoDB是一個(gè)非關(guān)系型數(shù)據(jù)庫(kù)占业。
在過(guò)去的幾十年中,都是關(guān)系模型占領(lǐng)統(tǒng)治地位纯赎。在大家的心中已經(jīng)根深蒂固地把數(shù)據(jù)庫(kù)和關(guān)系模型畫(huà)上了等號(hào)谦疾。所以使用的時(shí)候很多人在思維的轉(zhuǎn)化方面非常困難,也直接導(dǎo)致了使用方式的不正確犬金,以至于MongoDB在性能上的表現(xiàn)達(dá)不到期望的標(biāo)準(zhǔn)念恍。
從實(shí)際上來(lái)說(shuō),關(guān)系模型只是一個(gè)理論晚顷,理論和現(xiàn)實(shí)還是有一定差距的峰伙。我們用理論只是為了更好的描述現(xiàn)實(shí)中的一些東西,讓大家更容易理解该默。關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)這兩種理論同樣是以前在用關(guān)系模型來(lái)描述現(xiàn)實(shí)中的東西瞳氓。在這么多年后,我們要扭轉(zhuǎn)一下之前的這種固有思維栓袖。
MongoDB要做的就是把數(shù)據(jù)變成一個(gè)應(yīng)用匣摘,直接能夠使用而不需要再進(jìn)行額外處理的一個(gè)過(guò)程。而且它要非彻危快的把數(shù)據(jù)緩存在內(nèi)存當(dāng)中音榜,它要能做各種各樣的事情。這個(gè)其實(shí)就是我們常說(shuō)的反范式捧弃。但是到目前為止赠叼,反范式不再是我們唯一的選擇。在范式的基礎(chǔ)上塔橡,我們可以選擇反范式的模型來(lái)設(shè)計(jì)數(shù)據(jù)庫(kù)梅割。這就是MongoDB背后的思想,跟關(guān)系數(shù)據(jù)庫(kù)最明顯的一個(gè)區(qū)別葛家。
如何使用MongoDB解決實(shí)際問(wèn)題
首先我們應(yīng)該去了解這個(gè)問(wèn)題有什么特點(diǎn)户辞,不同的特點(diǎn)會(huì)決定我們?nèi)绾蝸?lái)選擇一個(gè)合適的數(shù)據(jù)庫(kù)。
如果我們決定用MongoDB來(lái)實(shí)現(xiàn)這個(gè)軟件癞谒,我們的過(guò)程和傳統(tǒng)過(guò)程不一樣的地方就在于詳細(xì)設(shè)計(jì)底燎。在關(guān)系模型的應(yīng)用當(dāng)中,詳細(xì)設(shè)計(jì)包含了數(shù)據(jù)庫(kù)設(shè)計(jì)弹砚、數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)双仍。要把這個(gè)數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成一個(gè)關(guān)系模型,就需要設(shè)計(jì)數(shù)據(jù)庫(kù)模型來(lái)做這個(gè)事情桌吃。主要區(qū)別就在于朱沃,用MongoDB來(lái)實(shí)現(xiàn)之后,我們要得到數(shù)據(jù)結(jié)構(gòu),并了解我們會(huì)怎樣使用這個(gè)數(shù)據(jù)結(jié)構(gòu)逗物,然后才進(jìn)行數(shù)據(jù)模型的設(shè)計(jì)搬卒。也就是說(shuō)我們的數(shù)據(jù)模型沒(méi)有一個(gè)固定的原則,而是根據(jù)我們?cè)鯓尤ナ褂眠@個(gè)數(shù)據(jù)翎卓,來(lái)決定怎樣才是更好的數(shù)據(jù)模型契邀。
關(guān)系模型是根據(jù)所需要的數(shù)據(jù)結(jié)構(gòu)范式化得到一個(gè)關(guān)系模型,非關(guān)系模型同樣是根據(jù)應(yīng)用所需要的數(shù)據(jù)結(jié)構(gòu)失暴,根據(jù)不同的原則來(lái)決定這個(gè)數(shù)據(jù)最終變成什么樣子坯门。
使用非關(guān)系數(shù)據(jù)庫(kù)的關(guān)鍵點(diǎn)
第一個(gè)就是要轉(zhuǎn)變思路。我們的原則是怎樣方便應(yīng)用更高效的去使用讀取或者去寫(xiě)入逗扒。思路首先要轉(zhuǎn)變過(guò)來(lái)古戴,否則后面做的所有的工作都得推翻重來(lái)。不要按照關(guān)系數(shù)據(jù)庫(kù)的思路來(lái)設(shè)計(jì)非關(guān)系數(shù)據(jù)的模型缴阎。
第二個(gè)就是要積累經(jīng)驗(yàn)允瞧。只有在積累一定的經(jīng)驗(yàn)之后,看到一些數(shù)據(jù)時(shí)就會(huì)知道蛮拔,如果這個(gè)數(shù)據(jù)用非關(guān)系模型來(lái)設(shè)計(jì)應(yīng)該是怎樣的述暂。
第三個(gè)就是最重要的背后思想。在MongoDB的這個(gè)應(yīng)用中建炫,我們把數(shù)據(jù)看作是應(yīng)用的一部分而不是獨(dú)立的一個(gè)部分畦韭。以前進(jìn)行軟件迭代的時(shí)候,做完分析概要設(shè)計(jì)編碼測(cè)試之后肛跌,要進(jìn)行下一輪的迭代艺配,要再具體做需求分析等等。以前我們的這個(gè)過(guò)程只是針對(duì)應(yīng)用來(lái)做衍慎,但對(duì)MongoDB來(lái)說(shuō)转唉,這個(gè)過(guò)程不光要針對(duì)應(yīng)用來(lái)做,還要針對(duì)數(shù)據(jù)來(lái)做稳捆。當(dāng)需求改變之后赠法,數(shù)據(jù)結(jié)構(gòu)也需要相應(yīng)的去改變。把數(shù)據(jù)和應(yīng)用緊密地聯(lián)系在一起乔夯,這樣才能保證應(yīng)用能夠以最高效的方式讀取或者去寫(xiě)入數(shù)據(jù)砖织。
實(shí)際應(yīng)用
第一次接觸MongoDB的時(shí)候,我當(dāng)時(shí)想找個(gè)有一些關(guān)系數(shù)據(jù)庫(kù)不能滿足的特點(diǎn)的應(yīng)用末荐,而且這個(gè)系統(tǒng)要對(duì)現(xiàn)有的系統(tǒng)影響不大侧纯,它又要能用上MongoDB的一些特性。最后我在12年的時(shí)候做了跟大家一樣的選擇甲脏,我用它來(lái)存日志眶熬。后來(lái)我把這個(gè)做成了一個(gè)開(kāi)源的項(xiàng)目妹笆。
對(duì)MongoDB的需求
第一 ?速度要快
記日志肯定不能影響現(xiàn)有系統(tǒng)的運(yùn)行。日志的量非常大聋涨,但通常不必保存很久晾浴,也會(huì)要進(jìn)行一些查詢,記日志也就是這些基本的要求牍白。如果沒(méi)有這個(gè)系統(tǒng),寫(xiě)到文件系統(tǒng)上抖棘,就要用記事本或者文件編輯工具去打開(kāi)茂腥,然后搜索會(huì)很麻煩,當(dāng)時(shí)我們考慮到這一點(diǎn)切省,所以做成了這樣一個(gè)系統(tǒng)最岗,大家隨時(shí)都可以去查日志。
第二 ?寫(xiě)入
按照日志的范式化模型來(lái)做朝捆,系統(tǒng)會(huì)要求我們先寫(xiě)日志般渡,再寫(xiě)一堆異常,導(dǎo)致效率非常低芙盘。用MongoDB來(lái)做的話驯用,利用非關(guān)系數(shù)據(jù)庫(kù)的一個(gè)目的,把它全部寫(xiě)在一起儒老,節(jié)省更多的時(shí)間蝴乔,能夠讓我們更高效的去寫(xiě)入。如果把設(shè)計(jì)成模型的話驮樊,那這些查詢也都很容易地滿足到薇正。關(guān)系模型可以根據(jù)每一個(gè)innerException來(lái)查詢,但是它要寫(xiě)入更多次會(huì)更慢囚衔,處理邏輯會(huì)更復(fù)雜挖腰,讓?xiě)?yīng)用的邏輯更復(fù)雜,這就是它的一個(gè)優(yōu)勢(shì)和一個(gè)劣勢(shì)练湿。
第三 ?方案
我們一直強(qiáng)調(diào)的就是沒(méi)有最好的方案猴仑,只有最合理的方案,這是設(shè)計(jì)當(dāng)中很重要的一個(gè)原則鞠鲜。
第四 ?模式演化
現(xiàn)在加入了一個(gè)新的需求宁脊,把一些自定義的數(shù)據(jù)加到日志里。對(duì)MongoDB來(lái)說(shuō)反而是一件更容易的事情贤姆,我們把自定義的結(jié)構(gòu)寫(xiě)在了原來(lái)的文檔中榆苞,這樣的話能夠使擴(kuò)展起來(lái)非常容易。模式的演化會(huì)造成數(shù)據(jù)結(jié)構(gòu)有非常大的變化霞捡,因?yàn)閿?shù)據(jù)結(jié)構(gòu)是根據(jù)讀寫(xiě)模式來(lái)決定的坐漏,所以如果當(dāng)需求發(fā)生了很大變化的時(shí)候,可能讀寫(xiě)的模式都已經(jīng)改變了,這個(gè)時(shí)候就要重新做一個(gè)設(shè)計(jì)赊琳,數(shù)據(jù)要遷移街夭,這都是有可能發(fā)生的。這也是我們前面所提到的一個(gè)很重要的思路——數(shù)據(jù)是應(yīng)用的一部分躏筏,它會(huì)隨著應(yīng)用一起迭代板丽。這也是MongoDB設(shè)計(jì)的過(guò)程中一個(gè)很重要的原則。
這就是今天分享的全部的內(nèi)容趁尼,謝謝大家埃碱!