MongoDB 學習

2020-08-13 14:13:00

數據庫介紹

關係型數據庫

關係型數據庫,是指採用了關係模型來組織數據的數據庫,其以行和列的形式儲存數據,以便於使用者理解,關係型數據庫這一系列的行和列被稱爲表,一組表組成了數據庫。使用者通過查詢來檢索數據庫中的數據,而查詢是一個用於限定數據庫中某些區域的執行程式碼。關係模型可以簡單理解爲二維表格模型,而一個關係型數據庫就是由二維表及其之間的關係組成的一個數據組織。

關係型數據庫遵循ACID規則

事務在英文中是transaction,和現實世界中的交易很類似,它有如下四個特性:

1、A (Atomicity) 原子性

原子性很容易理解,也就是說事務裡的所有操作要麼全部做完,要麼都不做,事務成功的條件是事務裡的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾。

比如銀行轉賬,從A賬戶轉100元至B賬戶,分爲兩個步驟:1)從A賬戶取100元;2)存入100元至B賬戶。這兩步要麼一起完成,要麼一起不完成,如果只完成第一步,第二步失敗,錢會莫名其妙少了100元。

2、C (Consistency) 一致性

一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的執行不會改變數據庫原本的一致性約束。

例如現有完整性約束a+b=10,如果一個事務改變了a,那麼必須得改變b,使得事務結束後依然滿足a+b=10,否則事務失敗。

3、I (Isolation) 獨立性

所謂的獨立性是指併發的事務之間不會互相影響,如果一個事務要存取的數據正在被另外一個事務修改,只要另外一個事務未提交,它所存取的數據就不受未提交事務的影響。

比如現在有個交易是從A賬戶轉100元至B賬戶,在這個交易還未完成的情況下,如果此時B查詢自己的賬戶,是看不到新增加的100元的。

4、D (Durability) 永續性

永續性是指一旦事務提交後,它所做的修改將會永久的儲存在數據庫上,即使出現宕機也不會丟失。

NoSQL

NoSQL,指的是非關係型的數據庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型數據庫的數據庫管理系統的統稱。

NoSQL用於超大規模數據的儲存。(例如谷歌或Facebook每天爲他們的使用者收集萬億位元的數據)。這些型別的數據儲存不需要固定的模式,無需多餘操作就可以橫向擴充套件。

RDBMS vs NoSQL

RDBMS(關係數據庫管理系統)

  • 高度組織化結構化數據
  • 結構化查詢語言(SQL) (SQL)
  • 數據和關係都儲存在單獨的表中。
  • 數據操縱語言,數據定義語言
  • 嚴格的一致性
  • 基礎事務

NoSQL

  • 代表着不僅僅是SQL
  • 沒有宣告性查詢語言
  • 沒有預定義的模式
    -鍵 - 值對儲存,列儲存,文件儲存,圖形數據庫
  • 最終一致性,而非ACID屬性
  • 非結構化和不可預知的數據
  • CAP定理
  • 高效能,高可用性和可伸縮性

CAP定理

在電腦科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer’s theorem), 它指出對於一個分佈式計算系統來說,不可能同時滿足以下三點:

一致性(Consistency) (所有節點在同一時間具有相同的數據)
可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
分隔容忍(Partition tolerance) (系統中任意資訊的丟失或失敗不會影響系統的繼續運作)
CAP理論的核心是:一個分佈式系統不可能同時很好的滿足一致性,可用性和分割區容錯性這三個需求,最多隻能同時較好的滿足兩個。

因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:

CA - 單點叢集,滿足一致性,可用性的系統,通常在可延伸性上不太強大。
CP - 滿足一致性,分割區容忍性的系統,通常效能不是特別高。
AP - 滿足可用性,分割區容忍性的系統,通常可能對一致性要求低一些。

NoSQL的優點/缺點

優點:

  • 高可延伸性
  • 分佈式計算
  • 低成本
  • 架構的靈活性,半結構化數據
  • 沒有複雜的關係

缺點:

  • 沒有標準化
  • 有限的查詢功能(到目前爲止)
  • 最終一致是不直觀的程式

ACID vs BASE

ACID BASE
原子性(Atomicity) 基本可用(Basically Available)
一致性(Consistency) 軟狀態/柔性事務(Soft state)
隔離性(Isolation) 最終一致性 (Eventual consistency)
永續性 (Durable)

NoSQL 數據庫分類

  • 列儲存:顧名思義,是按列儲存數據的。最大的特點是方便儲存結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。eg:Hbase、Cassandra、Hypertable。
  • 文件儲存:文件儲存一般用類似json的格式儲存,儲存的內容是文件型的。這樣也就有機會對某些欄位建立索引,實現關係數據庫的某些功能。eg:MongoDB、CouchDB。
  • key-value儲存:可以通過key快速查詢到其value。一般來說,儲存不管value的格式,照單全收。(Redis包含了其他功能)。eg:Tokyo Cabinet / Tyrant、Berkeley DB、MemcacheDB、Redis。
  • 圖儲存:圖形關係的最佳儲存。使用傳統關係數據庫來解決的話效能低下,而且設計使用不方便。eg:Neo4J、FlockDB。
  • 物件儲存:通過類似物件導向語言的語法操作數據庫,通過物件的方式存取數據。eg:db4o、Versant。
  • xml數據庫:高效的儲存XML數據,並支援XML的內部查詢語法,比如XQuery,Xpath。eg:Berkeley DB XML、BaseX。

MongoDB簡介

MongoDB 是由C++語言編寫的,是一個基於分佈式檔案儲存的開源數據庫系統。

在高負載的情況下,新增更多的節點,可以保證伺服器效能。

MongoDB 旨在爲WEB應用提供可延伸的高效能數據儲存解決方案。

MongoDB 將數據儲存爲一個文件,數據結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。
MongoDB 参考json

主要特點

1、MongoDB 是一個面向文件儲存的數據庫,操作起來比較簡單和容易。
2、可以在MongoDB記錄中設定任何屬性的索引 (如:FirstName=「Sameer」,Address=「8 Gandhi Road」)來實現更快的排序。
3、可以通過本地或者網路建立數據映象,這使得MongoDB有更強的擴充套件性。
4、如果負載的增加(需要更多的儲存空間和更強的處理能力) ,它可以分佈在計算機網路中的其他節點上這就是所謂的分片。
5、Mongo支援豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文件中內嵌的物件及陣列。
6、MongoDb 使用update()命令可以實現替換完成的文件(數據)或者一些指定的數據欄位 。
7、Mongodb中的Map/reduce主要是用來對數據進行批次處理和聚合操作。
8、Map和Reduce。Map函數呼叫emit(key,value)遍歷集閤中所有的記錄,將key與value傳給Reduce函數進行處理。
9、Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
10、GridFS是MongoDB中的一個內建功能,可以用於存放大量小檔案。
11、MongoDB允許在伺服器端執行指令碼,可以用Javascript編寫某個函數,直接在伺服器端執行,也可以把函數的定義儲存在伺服器端,下次直接呼叫即可。
12、MongoDB支援各種程式語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
13、MongoDB安裝簡單。