NoSQL,泛指非關系型的數據庫,全稱Not Only SQL,意即“不僅僅是SQL”。
NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。在過去幾年,關系型數據庫一直是數據持久化的唯 一選擇,數據工作者考慮的也只是在這些傳統數據庫中做篩選,比如SQL Server、Oracle或者是MySQL。甚至是做一些默認的選擇,比如使用.NET的一般會選擇SQL Server;使用Java的可能會偏向Oracle,Ruby是MySQL,Python則是PostgreSQL或MySQL等等。
原因很簡單:過去很長一段時間內,關系數據庫的健壯性已經在多數應用程序中得到證實。我們可以使用這些傳統數據庫良好的控制並發操作、事務等等。然 而如果傳統的關系型數據庫一直這麼可靠,那麼還有NoSQL什麼事?NoSQL之所以生存並得到發展,是因為它做到了傳統關系型數據庫做不到的事!
我們使用Python、Ruby、Java、.Net等語言編寫應用程序,這些語言有一個共同的特性——面向對象。但是我們使用MySQL、 PostgreSQL、Oracle以及SQL Server,這些數據庫同樣有一個共同的特性——關系型數據庫。這裡就牽扯到了“Impedance Mismatch”( 阻抗不匹配)這個術語:存儲結構是面向對象的,但是數據庫卻是關系的,所以在每次存儲或者查詢數據時,我們都需要做轉換。Hibernate這樣的ORM 框架確實可以簡化這個過程,但是在對查詢有高性能需求時,這些ORM框架就捉襟見肘了。
網絡應用程序的規模日漸變大,我們需要儲存更多的數據、服務更多的用戶以及需求更多的計算能力。為了應對這種情形,我們需要不停的擴展。擴展分為兩 類:一種是縱向擴展,即購買更好的機器,更多的磁盤、更多的內存等等;另一種是橫向擴展,即購買更多的機器組成集群。在巨大的規模下,縱向擴展發揮的作用 並不是很大。首先單機器性能提升需要巨額的開銷並且有著性能的上限,在Google和Facebook這種規模下,永遠不可能使用一台機器支撐所有的負 載。鑒於這種情況,我們需要新的數據庫,因為關系數據庫並不能很好的運行在集群上。不錯你也可能會去搭建關系數據庫集群,但是他們使用的是共享存儲,這並 不是我們想要的類型。於是就有了以Google、Facebook、Amazon這些試圖處理更多傳輸所引領的NoSQL紀元。
NoSQL數據庫在以下的這幾種情況下比較適用:
1、數據模型比較簡單;
2、需要靈活性更強的IT系統;
3、對數據庫性能要求較高;
4、不需要高度的數據一致性;
5、對於給定key,比較容易映射復雜值的環境。
鍵值數據庫就像在傳統語言中使用的哈希表。你可以通過key來添加、查詢或者刪除數據,鑒於使用主鍵訪問,所以會獲得不錯的性能及擴展性。
鍵值數據庫查找速度快,數據無結構化,通常只被當作字符串或者二進制數據。
適用的場景
儲存用戶信息,比如會話、配置文件、參數、購物車等等。這些信息一般都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。
不適用場景
1. 取代通過鍵查詢,而是通過值來查詢。Key-Value數據庫中根本沒有通過值查詢的途徑。
2. 需要儲存數據之間的關系。在Key-Value數據庫中不能通過兩個或以上的鍵來關聯數據。
3. 事務的支持。在Key-Value數據庫中故障產生時不可以進行回滾。
產品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort
有誰在使用
GitHub,一個開源代碼庫以及版本控制系統,是管理軟件開發以及發現已有代碼的首選方法,在GitHub,用戶可以十分輕易地找到海量的開源代碼。
BestBuy ,百思買集團(Best Buy),全球最大家用電器和電子產品零售集團。
有誰在使用
Twitter (Redis和Memcached),一家美國社交網絡及微博客服務的網站,是全球互聯網上訪問量最大的十個網站之一。是一個廣受歡迎的社交網絡及微博客服務的網站。
StackOverFlow ,是一個與程序相關的IT技術問答網站。用戶可以在網站免費提交問題,浏覽問題,索引相關內容。是程序員經常光顧的網站之一。
Instagram,是一款支持iOS、Windows Phone、Android平台的移動應用,允許用戶在任何環境下抓拍下自己的生活記憶,選擇圖片的濾鏡樣式,一鍵分享至Instagram、 Facebook、Twitter、Flickr、Tumblr、foursquare或者新浪微博平台上。不僅僅是拍照,作為一款輕量級但十分有趣的 App,Instagram 在移動端融入了很多社會化元素,包括好友關系的建立、回復、分享和收藏等,這是Instagram 作為服務存在而非應用存在最大的價值。
**Flick**r,雅虎旗下圖片分享網站。為一家提供免費及付費數位照片儲存、分享方案之線上服務,也提供網絡社群服務的平台。其重要特點就是基於社 會網絡的人際關系的拓展與內容的組織。這個網站的功能之強大,已超出了一般的圖片服務,比如圖片服務、聯系人服務、組群服務。
暴雪,大名鼎鼎的游戲公司。
新浪、街旁、知乎等。
有誰在使用
Twitter (Redis和Memcached)
Youtube ,世界上最大的視頻網站。
Wikipedia,維基百科是一個基於維基技術的多語言百科全書協作計劃,用多種語言編寫的網絡百科全書。
WordPress.com,WordPress是一款個人博客系統,並逐步演化成一款內容管理系統軟件,用戶可以在支持PHP和MySQL數據庫的服務器上架設屬於自己的網站,也可以把 WordPress當作一個內容管理系統(CMS)來使用。
面向文檔數據庫會將數據以文檔的形式儲存。每個文檔都是自包含的數據單元,是一系列數據項的集合。每個數據項都有一個名稱與對應的值,值既可以是簡 單的數據類型,如字符串、數字和日期等;也可以是復雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的, 數據可以使用XML、JSON或者JSONB等多種形式存儲。
數據結構要求不嚴格,表結構可變,不需要像關系型數據庫一樣需要預先定義表結構,但是查詢性能不高,而且缺乏統一的查詢語法。
適用的場景
1. 日志。企業環境下,每個應用程序都有不同的日志信息。Document-Oriented數據庫並沒有固定的模式,所以我們可以使用它儲存不同的信息。
2. 分析。鑒於它的弱模式結構,不改變模式下就可以儲存不同的度量方法及添加新的度量。
不適用場景
在不同的文檔上添加事務。Document-Oriented數據庫並不支持文檔間的事務,如果對這方面有需求則不應該選用這個解決方案。
產品:MongoDB、CouchDB、RavenDB、Terrastore 、OrientDB
有誰在使用
Craiglist上使用MongoDB的存檔數十億條記錄。
FourSquare,基於位置的社交網站,在Amazon EC2的服務器上使用MongoDB分享數據。
Shutterfly,以互聯網為基礎的社會和個人出版服務,使用MongoDB的各種持久性數據存儲的要求。
bit.ly, 一個基於Web的網址縮短服務,使用MongoDB的存儲自己的數據。
spike.com,一個MTV網絡的聯營公司, spike.com使用MongoDB的。
Intuit公司,一個為小企業和個人的軟件和服務提供商,為小型企業使用MongoDB的跟蹤用戶的數據。
sourceforge.net,資源網站查找,創建和發布開源軟件免費,使用MongoDB的後端存儲。
etsy.com ,一個購買和出售手工制作物品網站,使用MongoDB。
紐約時報,領先的在線新聞門戶網站之一,使用MongoDB。
CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB。
列存儲數據庫將數據儲存在列族(column family)中,一個列族存儲經常被一起查詢的相關數據。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。
列存儲查找速度快,可擴展性強,更容易進行分布式擴展,適用於分布式的文件系統。
適用的場景
1. 日志。因為我們可以將數據儲存在不同的列中,每個應用程序可以將信息寫入自己的列族中。
2. 博客平台。我們儲存每個信息到不同的列族中。舉個例子,標簽可以儲存在一個,類別可以在一個,而文章則在另一個。
不適用場景
1. 如果我們需要ACID事務。Vassandra就不支持事務。
2. 原型設計。如果我們分析Cassandra的數據結構,我們就會發現結構是基於我們期望的數據查詢方式而定。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。
產品:Cassandra、HBase