下一篇文章: MongoDB指南---二、MongoDB基礎知識-文檔、集合、數據庫、客戶端
MongoDB是一款強大、靈活,且易於擴展的通用型數據庫。它能擴展出很是多的功能,如二級索引(secondary index)、範圍查詢(range query)、排序、聚合(aggregation),以及地理空間索引(geospatial index)。本章涵蓋了MongoDB的主要設計特色。數據庫
MongoDB是一個面向文檔(document-oriented)的數據庫,而不是關係型數據庫。不採用關係模型主要是爲了得到更好的擴展性。固然, 還有其餘一些好處。
與關係型數據庫相比,面向文檔的數據庫再也不有「行」(row)的概念,取而代之的是更爲靈活的「文檔」(document)模型。經過在文檔中嵌入文檔和數組,面向文檔的方法可以僅使用一條記錄來表現複雜的層次關係,這與使用現代面嚮對象語言的開發者對數據的見解一致。
另外,再也不有預約義模式(predefined schema):文檔的鍵(key)和值(value)再也不是固定的類型和大小。因爲沒有固定的模式,根據須要添加或刪除字段變得更容易了。一般,因爲開發者可以進行快速迭代,因此開發進程得以加快。並且,實驗更容易進行。開發者能嘗試大量的數據模型,從中選擇一個最好的。segmentfault
應用程序數據集的大小正在以難以想象的速度增加。隨着可用帶寬的增加和存儲器價格的降低,即便是一個小規模的應用程序,須要存儲的數據量也可能大得驚人,甚至超出了不少數據庫的處理能力。過去很是罕見的T級別數據,如今已經是司空見慣了。
因爲須要存儲的數據量不斷增加,開發者面臨一個困難:應該如何擴展數據庫?實質上,這是縱向擴展(scale up)和橫向擴展(scale out)之間的選擇。縱向擴展就是使用計算能力更強的機器,而橫向擴展就是經過分區將數據分散到更多機器上。一般,縱向擴展是最省力的作法,其缺點是大型機通常都很是昂貴。並且,當數據量達到機器的物理極限時,不管花多少錢也買不到更強的機器了。另外一個選擇是橫向擴展:要增長存儲空間或提升性能,只需購買一臺普通的服務器並把它添加到集羣中就能夠了。橫向擴展既便宜又易於擴展;不過,管理1000臺機器比管理一臺機器顯然要困可貴多。
MongoDB的設計採用橫向擴展。面向文檔的數據模型使它能很容易地在多臺服務器之間進行數據分割。MongoDB能自動處理跨集羣的數據和負載,自動從新分配文檔,以及將用戶請求路由到正確的機器上。這樣,開發者可以集中精力編寫應用程序,而不須要考慮如何擴展的問題。若是一個集羣須要更大的容量,只須要向集羣添加新服務器,MongoDB就會自動將現有數據向新服務器傳送。數組
MongoDB做爲一款通用型數據庫,除了可以建立、讀取、更新和刪除數據以外,還提供一系列不斷擴展的獨特功能。緩存
MongoDB支持通用二級索引,容許多種快速查詢,且提供惟一索引、複合索引、地理空間索引,以及全文索引。 服務器
MongoDB支持「聚合管道」(aggregation pipeline)。用戶能經過簡單的片斷建立複雜的聚合,並經過數據庫自動優化。session
MongoDB支持存在時間有限的集合,適用於那些將在某個時刻過時的數據,如會話(session)。相似地,MongoDB也支持固定大小的集合,用於保存近期數據,如日誌。架構
MongoDB支持一種很是易用的協議,用於存儲大文件和文件元數據。
MongoDB並不具有一些在關係型數據庫中很廣泛的功能,如鏈接(join)和複雜的多行事務(multirow transaction)。省略這些功能是出於架構上的考慮(爲了獲得更好的擴展性),由於在分佈式系統中這兩個功能難以高效地實現。分佈式
MongoDB的一個主要目標是提供卓越的性能,這很大程度上決定了MongoDB的設計。MongoDB能對文檔進行動態填充(dynamic padding),也能預分配數據文件以利用額外的空間來換取穩定的性能。MongoDB把儘量多的內存用做緩存(cache),試圖爲每次查詢自動選擇正確的索引。總之,MongoDB在各方面的設計都旨在保持它的高性能。
雖然,MongoDB很是強大並試圖保留關係型數據庫的不少特性,但它並不追求具有關係型數據庫的全部功能。只要有可能,數據庫服務器就會將處理和邏輯交給客戶端(經過驅動程序或用戶的應用程序代碼來實現)。這種精簡方式的設計是MongoDB可以實現如此高性能的緣由之一。性能
本書將詳細說明MongoDB開發過程當中的一些特定設計背後的緣由和動機,藉此分享MongoDB背後的哲學。固然,掌握MongoDB最好的方式是建立一個易擴展、靈活、快速的功能完備的數據存儲,這也是MongoDB的意義所在。優化
下一篇文章: MongoDB指南---二、MongoDB基礎知識-文檔、集合、數據庫、客戶端