mongodb基礎知識:什么是文檔型數(shù)據(jù)庫?
mongoDB 是一個「文檔型數(shù)據(jù)庫,旨在簡化開發(fā)和擴展」。
這里很明顯的確定了 mongoDB 的部分優(yōu)勢,那就是「簡化開發(fā)和擴展」,那它是怎么簡化開發(fā)和擴展的呢?這就是需要我們后面認真的去研究了。
然后,又提到了一個關鍵的詞,「文檔型數(shù)據(jù)庫」,好了,到這里沒有聽過的朋友就蒙了,所以,我們往下看
什么是文檔型數(shù)據(jù)庫?
緊接著官方就給了說明,「MongoDB中的記錄是一個文檔,它是由字段和值對組成的數(shù)據(jù)結(jié)構(gòu)。MongoDB文檔類似于JSON對象。字段的值可以包括其他文檔,數(shù)組和文檔數(shù)組」。
這句話其實講的已經(jīng)非常明了了,它記錄的是一個文檔,所以相比 Mysql 這種關系型數(shù)據(jù)庫來說,moon 第一個想到的就是,「不用寫 DDL 語句來維護表字段的關系了」,文檔里面,你想怎么存就怎么存。
后面官方這里提到了文檔數(shù)據(jù)庫的「優(yōu)點」:
1.文檔(即對象)對應于許多編程語言中的內(nèi)置數(shù)據(jù)類型。
也就是說說文檔內(nèi)的「數(shù)據(jù)類型是自己定義」的,可以對應不同編程語言中的各種內(nèi)置數(shù)據(jù)類型
2.嵌入式文檔和數(shù)組減少了對昂貴連接的需求。
最直白的說就是類似于 Mysql 當中的 Join 語句少了
3.動態(tài)模式支持流暢的多態(tài)性。
這句話的 moon 是這樣理解的,由于文檔內(nèi)容是自定義的,所以會有各種格式,比如下面這種格式就體現(xiàn)了其多態(tài)性
普通電話,具有打電話發(fā)短信的功能
{
?"type":?"basic_phone",
?"message":1,
??"call":1
}
iphone,具有打電話發(fā)短信的功能,并且還能玩游戲
{
?"type":?"iphone",
?"message":1,
??"call":1,
??"game":1
}
集合/視圖/按需實例化視圖
MongoDB 將文檔存儲在集合中。集合類似于關系數(shù)據(jù)庫中的表。
這句話就很好理解了,我就不解釋了
除集合外,MongoDB 還支持:
只讀視圖(從MongoDB 3.4開始),和 SQL 的視圖沒有什么差異,視圖是基于表/集合之上進行動態(tài)查詢的一層對象,可以是虛擬的,也可以是物理的(物化視圖)。 按需實例化視圖。從4.2版本開始,MongoDB 為 aggregation pipeline 添加了 $merge 階段。此階段可以將管道結(jié)果合并到現(xiàn)有集合中,而不是完全替換現(xiàn)有集合。此功能允許用戶創(chuàng)建按需物化視圖,每次運行管道時都可以更新輸出集合的內(nèi)容。
主要特性
后面就介紹到了 mongoDB 的一些主要特性
高性能 1.對嵌入式數(shù)據(jù)模型的支持減少了數(shù)據(jù)庫系統(tǒng)上的I / O操作。
「什么是嵌入式的數(shù)據(jù)模型呢」?
MongoDB 提供高性能的數(shù)據(jù)持久化。特別是, 對嵌入式數(shù)據(jù)模型的支持減少了數(shù)據(jù)庫系統(tǒng)上的 I / O 操作(不用連表查詢了)。索引支持更快的查詢,并且可以包含來自嵌入式文檔和數(shù)組的鍵。
「為什么嵌入式模型可以減少數(shù)據(jù)庫系統(tǒng)上的 I / O 操作?」
豐富的查詢語言
MongoDB 支持豐富的查詢語言以支持讀寫操作(CRUD)以及:數(shù)據(jù)聚合 文本搜索和地理空間查詢。
「其實數(shù)據(jù)庫的核心作用就是兩個,存儲+查詢」,各種不同的數(shù)據(jù)庫幾乎都是圍繞著這兩個點去設計的,所以查詢方式也是非常重要的,MongoDB 并「不支持 sql 語句查詢」,但是對于已經(jīng)熟悉 sql 語句查詢的人來說,官方給了我們一個很簡單的理解方式,就是 sql 查詢和 mongo 查詢的對照
如上圖?https://docs.mongodb.com/v4.2/reference/sql-comparison/
SELECT?*?FROM?people?=?db.people.find
------------------------------------
SELECT?user_id,?status?FROM?people?
=?
db.people.find(
????{?},
????{?user_id:?1,?status:?1,?_id:?0?}
)
------------------------------------
SELECT?user_id,?status?FROM?people?WHERE?status?=?"A"
=
db.people.find(
????{?status:?"A"?},
????{?user_id:?1,?status:?1,?_id:?0?}
)
這樣是不是就很容易去理解了
高可用
MongoDB 的復制工具(稱為副本集)提供:
1.「自動_故障轉(zhuǎn)移」2.「數(shù)據(jù)冗余」。
副本集是一組維護相同數(shù)據(jù)集合的 mongod 實例,提供了冗余和提高了數(shù)據(jù)可用性。
水平拓展
MongoDB 提供水平可伸縮性作為其_核心_ 功能的一部分:分片將數(shù)據(jù)分布在一個集群的機器上。從 3.4 開始,MongoDB 支持基于分片鍵創(chuàng)建數(shù)據(jù)區(qū)域。在平衡群集中,MongoDB 僅將區(qū)域覆蓋的讀寫定向到區(qū)域內(nèi)的那些分片。
支持多種存儲引擎 WiredTiger 存儲引擎(包括對靜態(tài)加密的支持) 內(nèi)存存儲引擎。 MongoDB 支持多個存儲引擎:
另外,MongoDB 提供可插拔的存儲引擎 API,允許第三方為 MongoDB 開發(fā)存儲引擎。
這其實也是「類似于 mysql 存儲引擎可拔插的設計」,比較容易理解
架構(gòu)
作為一個新學習的數(shù)據(jù)庫,「架構(gòu)圖也是我們了解其信息的重要手段之一」
我們可以看到,在 mongoDB 的架構(gòu)中,核心的有三個組件
數(shù)據(jù)分片(Shards) 分片用于存儲真正的集群數(shù)據(jù),可以是一個單獨的 Mongod實例,也可以是一個副本集。生產(chǎn)環(huán)境下Shard一般是一個 Replica Set,以防止該數(shù)據(jù)片的單點故障。 對于分片集合(sharded collection)來說,每個分片上都存儲了集合的一部分數(shù)據(jù)(按照分片鍵切分),如果集合沒有分片,那么該集合的數(shù)據(jù)都存儲在數(shù)據(jù)庫的 Primary Shard中。
配置服務器(Config Servers) 保存集群的元數(shù)據(jù)(metadata),包含各個Shard的路由規(guī)則,也包括了 chunk (分片數(shù)據(jù)塊)的信息。
查詢路由(Query Routers) Mongos是 Sharded Cluster 的訪問入口,其本身并不持久化數(shù)據(jù) 。Mongos啟動后,會從 Config Server 加載元數(shù)據(jù),開始提供服務,并將用戶的請求正確路由到對應的Shard。 Sharding 集群可以部署多個 Mongos 以分擔客戶端請求的壓力。
其實到了這里就基本差不多了,但是為了「加深」我們對于 mongoDB 的「印象」,我會去再看一下,「MongoDB 和 Mysql 到底有什么區(qū)別」
MongoDB 和 Mysql 有什么區(qū)別
總結(jié)
以上的知識對于一個新技術的入門來說,肯定是夠用了 但是「重點還是在于歸納總結(jié)」,當你看完這些知識的時候,你腦海里對它有什么印象
對于 mongoDB ,當你看完這篇文章的時候,你需要知道它是一個
「cp 類型的文檔數(shù)據(jù)庫」 它有著自己「獨特的數(shù)據(jù)查詢方式」,操作語法是怎樣的 它支持「水平擴展」 「自動故障轉(zhuǎn)移和數(shù)據(jù)冗余(數(shù)據(jù)分散在不同的 shard 上,有備份)成就了它的高可用」 一個請求打到 mongoDB 中需要一層「路由來將請求映射到具體的數(shù)據(jù)分片上」 只「支持單個文檔的事物」。。。。。。
版權(quán)聲明:
本站所有文章和圖片均來自用戶分享和網(wǎng)絡收集,文章和圖片版權(quán)歸原作者及原出處所有,僅供學習與參考,請勿用于商業(yè)用途,如果損害了您的權(quán)利,請聯(lián)系網(wǎng)站客服處理。