注:本系列教程是自己學(xué)習(xí)的記錄忌堂,內(nèi)容來(lái)至 菜鳥(niǎo)教程
MongoDB入門教程01
MongoDB入門教程02
MongoDB入門教程03
MongoDB入門教程04
MongoDB入門教程05
1. MongoDB是什么倍阐?
一個(gè)NoSQL數(shù)據(jù)庫(kù)悬钳,是NoSQL中的一個(gè)分支:文檔數(shù)據(jù)庫(kù)缠捌。
一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)英染。由C++語(yǔ)言編寫搪锣,旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)方案。
一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品盔沫,是非關(guān)系數(shù)據(jù)庫(kù)中功能最豐富锌雀,最像關(guān)系數(shù)據(jù)庫(kù)的蚂夕。
在高負(fù)載的情況下迅诬,添加更多的節(jié)點(diǎn)腋逆,可以保證服務(wù)器性能。
2. MongoDB的主要特點(diǎn)
MongoDB是一個(gè)面向文檔存儲(chǔ)的數(shù)據(jù)庫(kù)侈贷,安裝惩歉、操作簡(jiǎn)單
可以設(shè)置任何屬性的索引(如:firstname="Sameer", Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序
可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得MongoDB有更強(qiáng)的擴(kuò)展性
如果負(fù)載增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力)俏蛮,可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上撑蚌,這就是所謂的分片
支持豐富的查詢表達(dá)式。查詢指令使用JSON形式的標(biāo)記搏屑,可輕易查詢文檔中內(nèi)嵌的對(duì)象及數(shù)組
使用update()命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段
Map/Reduce主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作
Map和Reduce Map函數(shù)調(diào)用emit(key,value)遍歷集合中所有的記錄争涌,將key與value傳給Reduce函數(shù)進(jìn)行處理
Map函數(shù)和Reduce函數(shù)是使用Javascript編寫的,并可以通過(guò)db.runCommand或mapreduce命令來(lái)執(zhí)行MapReduce操作
GridFS是MongoDB中的一個(gè)內(nèi)置功能辣恋,可以用于存放大量小文件
允許在服務(wù)端執(zhí)行腳本亮垫,可以用Javascript編寫某個(gè)函數(shù),直接在服務(wù)端執(zhí)行伟骨,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端饮潦,下次直接調(diào)用即可
支持各種編程語(yǔ)言:RUBY,PYTHON携狭,JAVA继蜡,C++,PHP逛腿,C#等多種語(yǔ)言
3. NoSQL的應(yīng)用場(chǎng)景是什么稀并?
摘至:作者 接灰的電子產(chǎn)品 鏈接 http://www.reibang.com/p/fe3b9532b852
假設(shè)說(shuō)我們現(xiàn)在要構(gòu)建一個(gè)論壇,用戶可以發(fā)布帖子(帖子內(nèi)容包括文本单默、視頻碘举、音頻和圖片等)。那么我們可以畫(huà)出一個(gè)下圖的表關(guān)系結(jié)構(gòu)雕凹。
這種情況下如果我們需要展示帖子的文字殴俱,以及關(guān)聯(lián)的圖片、音頻枚抵、視頻线欲、用戶評(píng)論、贊和用戶信息的話汽摹,我們需要關(guān)聯(lián)8張表來(lái)取得自己想要的數(shù)據(jù)李丰。如果我們有這樣的帖子列表,隨著用戶的滾動(dòng)動(dòng)態(tài)加載逼泣,同時(shí)需要監(jiān)聽(tīng)是否有新內(nèi)容產(chǎn)生趴泌,這樣的一個(gè)任務(wù)我們需要太多這種復(fù)雜的查詢了舟舒。
NoSQL解決這類問(wèn)題的思路是,干脆拋棄傳統(tǒng)的表結(jié)構(gòu)嗜憔,直接存儲(chǔ)包含一個(gè)帖子所有內(nèi)容的數(shù)據(jù)秃励,像下面這樣。
{
"id":"5894a12f-dae1-5ab0-5761-1371ba4f703e",
"title":"2017年的Spring發(fā)展方向",
"date":"2017-01-21",
"body":"這篇文章主要探討如何利用Spring Boot集成NoSQL",
"createdBy":User,
"images":["http://dev.local/myfirstimage.png","http://dev.local/mysecondimage.png"],
"videos":[
{"url":"http://dev.local/myfirstvideo.mp4", "title":"The first video"},
{"url":"http://dev.local/mysecondvideo.mp4", "title":"The second video"}
],
"audios":[
{"url":"http://dev.local/myfirstaudio.mp3", "title":"The first audio"},
{"url":"http://dev.local/mysecondaudio.mp3", "title":"The second audio"}
]
}
NoSQL一般情況下是沒(méi)有Schema這個(gè)概念的吉捶,這給開(kāi)發(fā)帶來(lái)了較大的自由度夺鲜。因?yàn)樵陉P(guān)系型數(shù)據(jù)庫(kù)中,一旦Schema確定呐舔,以后更改Schema币励,維護(hù)Schema是很麻煩的一件事。但反過(guò)來(lái)說(shuō)Schema對(duì)于維護(hù)數(shù)據(jù)的完整性是非常必要的珊拼。
一般來(lái)說(shuō)食呻,如果你在做一個(gè)Web、物聯(lián)網(wǎng)等類型的項(xiàng)目澎现,你應(yīng)該考慮使用NoSQL仅胞。如果你要面對(duì)的是一個(gè)對(duì)數(shù)據(jù)的完整性、事務(wù)處理等有嚴(yán)格要求的環(huán)境(如財(cái)務(wù)系統(tǒng))昔头,則應(yīng)該考慮關(guān)系型數(shù)據(jù)庫(kù)饼问。
4. NoSQL 簡(jiǎn)介
NoSQL(= Not Only SQL),即"不僅僅是SQL"揭斧。
在現(xiàn)代的計(jì)算系統(tǒng)上每天網(wǎng)絡(luò)上都會(huì)產(chǎn)生龐大的數(shù)據(jù)量莱革。
這些數(shù)據(jù)有很大一部分是由關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)來(lái)處理。 1970年 E.F.Codd's提出的關(guān)系模型的論文 "A relational model of data for large shared data banks"讹开,這使得數(shù)據(jù)建模和應(yīng)用程序編程更加簡(jiǎn)單盅视。
關(guān)系型模型是非常適合于客戶服務(wù)器編程,是結(jié)構(gòu)化數(shù)據(jù)在網(wǎng)絡(luò)和商務(wù)應(yīng)用的主導(dǎo)技術(shù)旦万。
NoSQL用于超大規(guī)模數(shù)據(jù)的存儲(chǔ)闹击。這些類型的數(shù)據(jù)存儲(chǔ)不需要固定的模式,無(wú)需多余操作就可以橫向擴(kuò)展成艘。
select fun, profit from real_world where relational=false
5. 關(guān)系型數(shù)據(jù)庫(kù)遵循ACID規(guī)則
事務(wù) Transaction赏半,和現(xiàn)實(shí)中的交易很類似,有四個(gè)特性:
-
A (Atomicity) 原子性
事務(wù)里的所有操作淆两,要么全部做完断箫,要么都不做,只要事務(wù)中的一個(gè)任務(wù)失敗秋冰,整個(gè)事務(wù)就失敗仲义,需要回滾。如銀行轉(zhuǎn)賬,從A賬戶轉(zhuǎn)100元到B賬戶埃撵,分為兩個(gè)步驟:1)從A賬戶取100元赵颅;2)存入100元到B賬戶。要么一起做完暂刘,要么都不做饺谬,否則錢就會(huì)莫名其妙的少了100元。
-
C (Consistency) 一致性
數(shù)據(jù)庫(kù)要一直處于一致的狀態(tài)鸳惯,事務(wù)的運(yùn)行不會(huì)改變數(shù)據(jù)庫(kù)原本的一致性約束商蕴。如完整性約束 a + b = 10,如果一個(gè)事務(wù)改變了a芝发,那么必須改變b,使得事務(wù)結(jié)束后依然滿足 a+b=10苛谷,否則事務(wù)失敗辅鲸。
-
I (Isolation) 獨(dú)立性
獨(dú)立性指并發(fā)的事務(wù)之間不會(huì)互相影響,如果一個(gè)事務(wù)要訪問(wèn)的數(shù)據(jù)腹殿,正在被另一個(gè)事務(wù)修改独悴,只要另外一個(gè)事務(wù)未提交,它所訪問(wèn)的數(shù)據(jù)就不受未提交事務(wù)的影響锣尉。如從A賬戶轉(zhuǎn)100元到B賬戶刻炒,在這個(gè)交易尚未完成的情況下,B查詢自己的賬戶自沧,是看不到新增加的100元的坟奥。
-
D (Durability) 持久性
持久性是指一旦事務(wù)提交后,它的修改將會(huì)永久的保存在數(shù)據(jù)庫(kù)上拇厢,即使出現(xiàn)宕機(jī)也不會(huì)丟失爱谁。
6. 分布式系統(tǒng)
分布式系統(tǒng)(distributed system)由多臺(tái)計(jì)算機(jī)和通信的軟件組件通過(guò)計(jì)算機(jī)網(wǎng)絡(luò)連接(本地網(wǎng)絡(luò)或廣域網(wǎng))組成。
分布式系統(tǒng)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)孝偎。正是因?yàn)檐浖奶匦苑玫校苑植际较到y(tǒng)具有高度的內(nèi)聚性和透明性。
因此,網(wǎng)絡(luò)和分布式系統(tǒng)之間的區(qū)別更多的在于高層軟件(特別是操作系統(tǒng)),而不是硬件森篷。
分布式系統(tǒng)可以應(yīng)用在不同的平臺(tái)上如:Pc窗宇、工作站、局域網(wǎng)和廣域網(wǎng)上等下面。
7. CAP定理(CAP theorem)
又稱布魯爾定理(Brewer's theorem):一個(gè)分布式計(jì)算系統(tǒng),不可能同時(shí)滿足以下三點(diǎn):
-
一致性(Consistency)
所有節(jié)點(diǎn)在同一時(shí)間具有相同的數(shù)據(jù)
-
可用性(Availability)
保證每個(gè)請(qǐng)求不管成功或者失敗都有響應(yīng)
-
分隔容忍(Partition tolerance)
系統(tǒng)中任意信息的丟失或失敗不會(huì)影響系統(tǒng)的繼續(xù)運(yùn)作
CAP的核心理論是:一個(gè)分布式系統(tǒng)不可能很好的同時(shí)滿足一致性,可用性和分隔容忍這三個(gè)需求叮姑,最多能同時(shí)滿足其中兩個(gè)。
因此,可將NoSQL數(shù)據(jù)庫(kù)分成滿足CA原則传透,滿足CP原則和滿足AP原則三大類:
CA:?jiǎn)吸c(diǎn)集群耘沼,滿足一致性和可用性,通常在可擴(kuò)展性上不強(qiáng)大
CP:滿足一致性朱盐,分區(qū)容忍性的系統(tǒng)群嗤,通常性能不是特別高
AP:滿足可用性,分區(qū)容忍性的系統(tǒng)兵琳,對(duì)一致性要求較低
8. 分布式計(jì)算的優(yōu)點(diǎn)
-
可靠性(容錯(cuò))
分布式計(jì)算系統(tǒng)中的一個(gè)重要優(yōu)點(diǎn)就是可靠性狂秘。一臺(tái)服務(wù)器的系統(tǒng)崩潰并不影響到其余的服務(wù)器
-
可擴(kuò)展性
在分布式計(jì)算系統(tǒng)可以根據(jù)需要增加更多的機(jī)器
-
資源共享
共享數(shù)據(jù)是必不可少的應(yīng)用,如銀行躯肌、預(yù)定系統(tǒng)
-
靈活性
由于該系統(tǒng)非常靈活者春,它更容易安裝,實(shí)施和調(diào)試新的服務(wù)
-
更快的速度
分布式計(jì)算系統(tǒng)可以有多臺(tái)計(jì)算機(jī)的計(jì)算能力清女,使得它比其他系統(tǒng)有更快的處理速度
-
開(kāi)放系統(tǒng)
本地或者遠(yuǎn)程都能訪問(wèn)到該服務(wù)
-
更高的性能
更好的性價(jià)比
9. 分布式計(jì)算的缺點(diǎn)
-
故障排除
故障排除和診斷問(wèn)題更加困難
-
軟件
更少的軟件支持
-
網(wǎng)絡(luò)
基礎(chǔ)設(shè)施的問(wèn)題钱烟,包括:傳輸問(wèn)題,高負(fù)載嫡丙,信息丟失等
-
安全性
開(kāi)放系統(tǒng)的特性存在數(shù)據(jù)的安全性和共享的風(fēng)險(xiǎn)等問(wèn)題
10. RDBMS vs NoSQL
RDBMS
高度組織化結(jié)構(gòu)化數(shù)據(jù)
結(jié)構(gòu)化查詢語(yǔ)言 SQL
數(shù)據(jù)和關(guān)系都存儲(chǔ)在單獨(dú)的表中
數(shù)據(jù)操作語(yǔ)言拴袭,數(shù)據(jù)定義語(yǔ)言
嚴(yán)格的一致性
基礎(chǔ)事務(wù)
NoSQL
代表著不僅僅是SQL
沒(méi)有聲明性查詢語(yǔ)言
沒(méi)有預(yù)定義的模式
key-value 鍵值對(duì)存儲(chǔ),列存儲(chǔ)曙博,文檔存儲(chǔ)拥刻,圖形數(shù)據(jù)庫(kù)
最終一致性,而非ACID屬性
非結(jié)構(gòu)化和不可預(yù)知的數(shù)據(jù)
CAP定理
高性能父泳,高可用性和可伸縮性
11. BASE
Base:Basically Available般哼,Soft-state,Eventually Consistent
BASE是NoSQL數(shù)據(jù)庫(kù)通常對(duì)可用性及一致性的弱要求原則:
Basically Available — 基本可用
Soft-state — 軟狀態(tài)/柔性事務(wù)尘吗。無(wú)連接的
Eventually Consistent — 最終一致性逝她,ACID的最終目的
12. NoSQL數(shù)據(jù)庫(kù)的分類
類型 | 代表NoSQL | 特點(diǎn) |
---|---|---|
列存儲(chǔ) | Hbase、 Cassandra睬捶、 Hypertable | 按列存儲(chǔ)數(shù)據(jù)黔宛。特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù),方便數(shù)據(jù)壓縮擒贸,對(duì)針對(duì)某一列或者某幾列的查詢有非常大的IO優(yōu)勢(shì) |
文檔存儲(chǔ) | MongoDB臀晃、CouchDB | 文檔存儲(chǔ) 一般用類似json的格式存儲(chǔ),存儲(chǔ)的內(nèi)容是文檔型的介劫。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引徽惋,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的某些功能。 |
鍵值對(duì)存儲(chǔ) | Redis座韵、 Tokyo Cabinet / Tyrant险绘、 Berkeley DB踢京、 MemcacheDB | 可以通過(guò)key快速查詢到其value。一般來(lái)說(shuō)宦棺,存儲(chǔ)不管value的格式瓣距,照單全收。(Redis包含了其他功能) |
圖存儲(chǔ) | Neo4J代咸、FlockDB | 圖形關(guān)系的最佳存儲(chǔ)蹈丸。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)來(lái)解決的話性能低下,而且設(shè)計(jì)使用不方便呐芥。 |
對(duì)象存儲(chǔ) | db4o逻杖、 Versant | 通過(guò)類似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)思瘟。 |
xml數(shù)據(jù)庫(kù) | Berkeley DB XML荸百、 BaseX | 高效的存儲(chǔ)XML數(shù)據(jù),并支持XML的內(nèi)部查詢語(yǔ)法潮太,比如XQuery,Xpath管搪。 |