文章目錄
- NoSQL簡介
- NoSQL的優勢
- NoSQL的特點
- MongoDB簡介
- MongoDB特點
- MongoDB適用情境
- NoSQL的一些產品
學習任何東西在沒有理解的前提下去背熟一些概念是沒有用的,就像只背會了幾個概念而沒有理解的開發人員去面試是經不住面試官的追問的。前面的兩篇對MongoDB做了簡單的介紹,能夠很快上手,對MongoDB有一個感性的認識。本篇大部分內容來自MongoDB權威指南和MongoDB實戰。希望在學習完整個MongoDB後能對本篇的內容有一個全新的認識。
NoSQL簡介
NoSQL,全稱是”Not Only Sql”,指的是非關係型的資料庫。這類資料庫主要有這些特點:非關係型的、分布式的、開源的、水平可擴充的。原始的目的是為了大規模 web 應用,這場全新的資料庫革命運動早期就有人提出,發展至2009 年趨勢越發高漲。NoSQL 的擁護者們提 倡運用非關係型的資料存放區,通常的應用如:模式自由、支援簡易複製、簡單的API、最終 的一致性 (非ACID )、大容量資料等。NoSQL 被我們用得最多的當數 key-value 儲存,當然還 有其他的文檔型的、列儲存、圖型資料庫、xml 資料庫等。相對於目前鋪天蓋地的關係型數 據庫運用,這一概念無疑是一種全新思維的注入。
NoSQL的優勢
同關係型資料庫相比,NoSQL有下面的一些優勢:
- 適合對資料庫高並發讀寫的需求。
- 適合對海量資料的高效率儲存和訪問的需求。
- 適合對資料庫的高可擴充性和高可用性的需求。
由於NoSQL的這些優勢,使得NoSQL比較適合以下的一些情境的使用:
- 對資料庫事務一致性要求不高的時候,因為NoSQL不支援事務(MongoDB是不支援事務的,其他的沒做研究)。
- 對資料庫的寫即時性和讀即時性要求不高的時候。
- 對複雜的SQL 查詢,特別是多表關聯查詢不多的時候。
NoSQL的特點
- 它可以處理超大量的資料
- 它運行在便宜的它運行在便宜的 PC 伺服器叢集上伺服器叢集上,意思是在資料庫不夠用的時候進行PC的叢集擴充很方便並且成本很低。
- 它擊碎了效能瓶頸,因為使用NoSQL省去了傳統的程式模型到SQL之間轉換的時間,執行效率更高。
- 它沒有過多的操作,意思是去掉了很多在關聯式資料庫中擁有而在實際又不怎麼使用的功能。
- 它的支援支援者源於社區者源於社區,所有的NoSQL產品都是開源的。
MongoDB簡介
MongoDB 是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。他支援的資料結構非常鬆散,是類似json 的bjson 格式,簡稱BSON,因此可 以儲存比較複雜的資料類型。MongoDB 最大的特點是他支援的查詢語言非常強大,其文法有點類似於物件導向的查詢語言,幾乎可以實作類別似關聯式資料庫單表查詢的絕大部分功能, 而且還支援對資料建立索引。它是一個面向集合的,模式自由的文檔型資料庫。
MongoDB特點
1 豐富的資料模型 MongoDB是一種面向文檔的資料庫。在MongoDB中文檔就相當於關係型資料庫中的行。文檔中可以包含很複雜的資料結構,這樣一條記錄就可以表示很複雜的層級關係。比如說文章表有一個欄位是評論,在關係型資料庫中我們通常會建一個評論表和文章表做關聯,在MongoDB中就可以直接將評論存在一條文章記錄的文檔中。更符合我們的思維。 MongoDB沒有模式,也就是說沒有表結構,文檔的欄位可以隨時添加,不會對原來資料有任何影響,使開發變得很容易。 2 容易擴充 在一些大型的網站中,資料的增長是非常驚人的。在面臨資料增長機器不夠用的時候通常有兩種做法:
- 購買更高配置的機器,會花費很大,而且達到物理極限後花錢也買不到更高配置的了。
- 進行擴充,將資料分散到多個機器上,這種在操作上會顯得複雜點。
MongoDB的設計就考慮到了擴充的問題,它所採用的面向文檔的資料模型使得可以自動在多台伺服器中切割資料。還可以平衡群集的資料和負載,自動進行文檔重排。 3 豐富的功能
- 索引:MongoDB支援通用輔助索引,可以進行多種快速查詢。
- 儲存Javascript:不必再使用預存程序了,可以直接在伺服器端存取Javascript的函數和值。
- 彙總:MongoDB支援MapReduce和其他彙總工具。
- 固定集合:集合的大小是有上限的,這對於日誌一類的資料很有用。
- 隱藏檔:MongoDB支援用一種容易使用的協議(GridFS)來儲存大型檔案。
4 更快的速度 高效能是MongoDB的目標,為了提高效能,就必須進行很多精簡的設計,相比關係型資料庫少了很多功能,但仍然保持著關係型資料庫的眾多的特性。一些精簡設計表現在:
- 使用MongoDB傳輸協議作為與伺服器互動的主要方式,將比較HTTP、Reset等可以節省不少開銷。
- 對文檔進行動態填充,預分配資料檔案,用空間換取時間,而且空間對於現在來說已不是問題。
- 預設的儲存引擎使用記憶體對應檔,將記憶體管理工作交給OS去處理。
- 動態查詢最佳化工具會記住執行查詢最高效的方式。
5 簡單的管理 MongoDB盡量讓伺服器自治來簡化資料庫的管理。除了啟動資料庫伺服器之外,幾乎沒有什麼管理操作了。如果主伺服器掛掉了,MongoDB會自動切換到備份伺服器上,並將備份伺服器提升為活躍伺服器。在分布式的環境下,群集只需要知道有新的節點就會自動整合和配置新的節點。
MongoDB適用情境
- 網站資料:MongoDB非常適合即時的插入,更新與查詢,並具備網站即時資料儲存所 需的複製及高度伸縮性 。
- 緩衝:由於效能很高,MongoDB 也適合作為資訊基礎設施的緩衝層。在系統重啟之後, 由MongoDB 搭建的持久化緩衝層可以避免下層的資料來源過載 。
- 大尺寸,低價值的資料:使用傳統的關係型資料庫儲存一些資料時可能會比較昂貴,在此之前,很多時候程式員往往會選擇傳統的檔案進行儲存 。
- 高伸縮性的情境:MongoDB 非常適合由數十或數百台伺服器組成的資料庫。MongoDB的路線圖中已經包含對MapReduce 引擎的內建支援 。
- 用於對象及JSON 資料的儲存:MongoDB 的BSON 資料格式非常適合文檔化格式的儲存及查詢 。
NoSQL的一些產品
Database |
Architecture |
Implementation Language |
Hypertable |
Bigtable, Column-oriented |
C++ |
HBase |
Bigtable, Column-oriented |
Java |
Cassandra |
Dynamo (with Bigtable data model) |
Java |
MongoDB |
Auto-sharding |
C++ |
Riak |
Dynamo, Key/Value store |
Erlang |
CouchDB |
Document-oriented (non-scalable) |
Erlang |
Redis |
In-memory, Key/Value store |
C |
Project Voldemort |
Dynamo |
Java |
Tokyo Cabinet/Tyrant |
Key/Value store |
C |
Dynomite |
Dynamo |
Erlang |
Amazon S3 |
Hosted Key/Value store |
Java |
Amazon RDS |
Hosted MySQL |
C |