NoSQL數據庫都被貼上不同用途的標簽,如MongoDB和CouchDB都是面向文檔的數據庫,但這並不意味着它們可以象JSON(JavaScript Object Notation,JavaScript對象標記)那樣以結構化數據形式存儲文本文檔。
JSON被認為是XML的代替品,它是一個輕量級的,基於文本交換數據的標准,和XML一樣具有人類易讀的特性。簡單的JSON數據結構叫做對象,可能包括多種數據類型,如整型(int),字符串(string),數組(array),日期(date),對象(object)和字節數組(bytearray)。
面向文檔的數據庫與關系數據庫有着顯著的區別,面向文檔的數據庫用一個有組織的文件來存儲數據,而不是用行來存儲數據,在MongoDB中,一組文檔被看作是一個集合,在關系數據庫中,許多行的集合被看作是一張表。
但同時它們的操作又是類似的,關系數據庫使用select,insert,update和delete操作表中的數據,面向文檔的數據庫使用query,insert,update和remove做意義相同的操作。
MongoDB中對象的最大尺寸被限制為4MB,但對象的數量不受限制,MongoDB可以通過集群加快操作的執行速度,當數據庫變得越來越大時,可以向集群增加服務器解決性能問題。
Mongo是一個高性能,開源,無模式的文檔型數據庫,它在許多場景下可用於替代傳統的關系型數據庫或鍵/值存儲方式。Mongo使用C++開發,提供了以下功能:
◆面向集合的存儲:適合存儲對象及JSON形式的數據。
◆動態查詢:Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
◆完整的索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,並生成一個高效的查詢計划。
◆查詢監視:Mongo包含一個監視工具用於分析數據庫操作的性能。
◆復制及自動故障轉移:Mongo數據庫支持服務器之間的數據復制,支持主-從模式及服務器之間的相互復制。復制的主要目標是提供冗余及自動故障轉移。
◆高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)。
◆自動分片以支持雲級別的伸縮性(處於早期alpha階段):自動分片功能支持水平的數據庫集群,可動態添加額外的機器。
MongoDB的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋梁,集兩者的優勢於一身。根據官方網站的描述,Mongo適合用於以下場景:
◆網站數據:Mongo非常適合實時的插入,更新與查詢,並具備網站實時數據存儲所需的復制及高度伸縮性。
◆緩存:由於性能很高,Mongo也適合作為信息基礎設施的緩存層。在系統重啟之后,由Mongo搭建的持久化緩存層可以避免下層的數據源過載。
◆大尺寸,低價值的數據:使用傳統的關系型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
◆高伸縮性的場景:Mongo非常適合由數十或數百台服務器組成的數據庫。Mongo的路線圖中已經包含對MapReduce引擎的內置支持。
◆用於對象及JSON數據的存儲:Mongo的BSON數據格式非常適合文檔化格式的存儲及查詢。
自然,MongoDB的使用也會有一些限制,例如它不適合:
◆高度事務性的系統:例如銀行或會計系統。傳統的關系型數據庫目前還是更適用於需要大量原子性復雜事務的應用程序。
◆傳統的商業智能應用:針對特定問題的BI數據庫會對產生高度優化的查詢方式。對於此類應用,數據倉庫可能是更合適的選擇。
◆需要SQL的問題
MongoDB支持OS X、Linux及Windows等操作系統,並提供了Python,PHP,Ruby,Java及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平台的驅動程序。
