程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MYSQL入門知識 >> NoSQL數據庫的四大家族

NoSQL數據庫的四大家族

編輯:MYSQL入門知識
 

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,比較容易映射復雜值的環境。

NoSQL數據庫的四大家族

一、鍵值(Key-Value)數據庫

鍵值數據庫就像在傳統語言中使用的哈希表。你可以通過key來添加、查詢或者刪除數據,鑒於使用主鍵訪問,所以會獲得不錯的性能及擴展性。
鍵值數據庫查找速度快,數據無結構化,通常只被當作字符串或者二進制數據。

適用的場景
儲存用戶信息,比如會話、配置文件、參數、購物車等等。這些信息一般都和ID(鍵)掛鉤,這種情景下鍵值數據庫是個很好的選擇。

不適用場景
1. 取代通過鍵查詢,而是通過值來查詢。Key-Value數據庫中根本沒有通過值查詢的途徑。
2. 需要儲存數據之間的關系。在Key-Value數據庫中不能通過兩個或以上的鍵來關聯數據。
3. 事務的支持。在Key-Value數據庫中故障產生時不可以進行回滾。

產品:Riak、Redis、Memcached、Amazon’s Dynamo、Project Voldemort

  • Riak
    Riak是以 Erlang 編寫的一個高度可擴展的分布式數據存儲,Riak的實現是基於Amazon的分布式key/value存儲引擎Dynamo,如圖1所示。
    NoSQL數據庫的四大家族0
    圖1
    Riak的設計目標之一就是高可用。Riak支持多節點構建的系統,每次讀寫請求不需要集群內所有節點參與也能勝任。提供一個靈活的 map/reduce 引擎,一個友好的 HTTP/JSON 查詢接口。目前有三種方式可以訪問 Riak:HTTP API(RESTful 界面)、Protocol Buffers 和一個原生 Erlang 界面。提供多個界面使你能夠選擇如何集成應用程序。
    riak-java-client 是 Riak 的 Java 客戶端開發類庫,示例代碼:
  • // create a client
    IRiakClient riakClient = RiakFactory.pbcClient(); //or RiakFactory.httpClient();
    // create a new bucket
    Bucket myBucket = riakClient.createBucket("myBucket").execute();
    // add data to the bucket
    myBucket.store("key1", "value1").execute();
    //fetch it back
    IRiakObject myData = myBucket.fetch("key1").execute();
    // you can specify extra parameters to the store operation using the
    // fluent builder style API
    myData = myBucket.store("key1", "value2").returnBody(true).execute();
    // delete
    myBucket.delete("key1").rw(3).execute();
     

有誰在使用
GitHub,一個開源代碼庫以及版本控制系統,是管理軟件開發以及發現已有代碼的首選方法,在GitHub,用戶可以十分輕易地找到海量的開源代碼。
BestBuy ,百思買集團(Best Buy),全球最大家用電器和電子產品零售集團。

  • Redis
    Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日志型、Key-Value數據庫,並提供多種語言的API。Redis支持存儲的value類型包括 string(字符串)、hash(散列)、list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add /remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。Redis數據都是緩存在 內存中,會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
    Jedis 是 Redis 官方首選的 Java 客戶端開發包。

有誰在使用
Twitter (Redis和Memcached),一家美國社交網絡及微博客服務的網站,是全球互聯網上訪問量最大的十個網站之一。是一個廣受歡迎的社交網絡及微博客服務的網站。
StackOverFlow ,是一個與程序相關的IT技術問答網站。用戶可以在網站免費提交問題,浏覽問題,索引相關內容。是程序員經常光顧的網站之一。
Instagram,是一款支持iOS、Windows Phone、Android平台的移動應用,允許用戶在任何環境下抓拍下自己的生活記憶,選擇圖片的濾鏡樣式,一鍵分享至Instagram、 Facebook、Twitter、Flickr、Tumblr、foursquare或者新浪微博平台上。不僅僅是拍照,作為一款輕量級但十分有趣的 App,Instagram 在移動端融入了很多社會化元素,包括好友關系的建立、回復、分享和收藏等,這是Instagram 作為服務存在而非應用存在最大的價值。
**Flick**r,雅虎旗下圖片分享網站。為一家提供免費及付費數位照片儲存、分享方案之線上服務,也提供網絡社群服務的平台。其重要特點就是基於社 會網絡的人際關系的拓展與內容的組織。這個網站的功能之強大,已超出了一般的圖片服務,比如圖片服務、聯系人服務、組群服務。
暴雪,大名鼎鼎的游戲公司。
新浪街旁知乎等。

  • Memcached
    Memcached 是一個基於一個存儲鍵/值對的高性能的分布式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高動態、數據庫驅動網站的速度。
    許多Web 應用程序都將數據保存到RDBMS中,應用服務器從中讀取數據並在浏覽器中顯示。但隨著數據量的增大,訪問的集中,就會出現RDBMS的負擔加重,數據庫 響應惡化,網站顯示延遲等重大影響。Memcached是高性能的分布式內存緩存服務器。一般的使用目的是通過緩存數據庫查詢結果,減少數據庫的訪問次 數,以提高動態Web 應用的速度、提高擴展性。如圖2所示。
    NoSQL數據庫的四大家族1
    圖2Memcached-Java-Client 是一個memcached Java客戶端API,應用廣泛,運行比較穩定。XMemcached也使用得比較廣泛,而且有較詳細的中文API文檔,具有如下特點:高性 能、支持完整的協議、支持客戶端分布、允許設置節點權重、動態增刪節點、支持JMX、與Spring框架和Hibernate-memcached的集 成、客戶端連接池、可擴展性好等。

有誰在使用
Twitter (Redis和Memcached)
Youtube ,世界上最大的視頻網站。
Wikipedia,維基百科是一個基於維基技術的多語言百科全書協作計劃,用多種語言編寫的網絡百科全書。
WordPress.com,WordPress是一款個人博客系統,並逐步演化成一款內容管理系統軟件,用戶可以在支持PHP和MySQL數據庫的服務器上架設屬於自己的網站,也可以把 WordPress當作一個內容管理系統(CMS)來使用。

二、面向文檔(Document-Oriented)數據庫

面向文檔數據庫會將數據以文檔的形式儲存。每個文檔都是自包含的數據單元,是一系列數據項的集合。每個數據項都有一個名稱與對應的值,值既可以是簡 單的數據類型,如字符串、數字和日期等;也可以是復雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的, 數據可以使用XML、JSON或者JSONB等多種形式存儲。

數據結構要求不嚴格,表結構可變,不需要像關系型數據庫一樣需要預先定義表結構,但是查詢性能不高,而且缺乏統一的查詢語法。

適用的場景
1. 日志。企業環境下,每個應用程序都有不同的日志信息。Document-Oriented數據庫並沒有固定的模式,所以我們可以使用它儲存不同的信息。
2. 分析。鑒於它的弱模式結構,不改變模式下就可以儲存不同的度量方法及添加新的度量。

不適用場景
在不同的文檔上添加事務。Document-Oriented數據庫並不支持文檔間的事務,如果對這方面有需求則不應該選用這個解決方案。

產品:MongoDB、CouchDB、RavenDB、Terrastore 、OrientDB

  • MongoDB
    MongoDB是一個基於分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。是一個介於關系數據庫和非關 系數據庫之間的產品,是非關系數據庫當中功能最豐富,最像關系數據庫的。它支持的數據結構非常松散,是類似json的bson格式,因此可以存儲比較復雜 的數據類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似於面向對象的查詢語言,幾乎可以實現類似關系數據庫單表查詢的絕大部分功 能,而且還支持對數據建立索引。
    mongoDB對Java支持的驅動包常用的是mongodb-java-driver,另外還有Mopa4j ,全稱是 MOngo Persistence API for Java,它將 POJO 映射到 com.mongodb.DBObject,反之也可以。

有誰在使用
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。

  • CouchDB
    CouchDB 是一個開源的面向文檔的數據庫管理系統,它提供以 JSON 作為數據格式的 REST 接口來對其進行操作,並可以通過視圖來操縱文檔的組織和呈現。術語 “Couch” 是 “Cluster Of Unreliable Commodity Hardware” 的首字母縮寫,它反映了 CouchDB 的目標具有高度可伸縮性,提供了高可用性和高可靠性,即使運行在容易出現故障的硬件上也是如此。
    CouchDB是分布式的數據庫,它可以把存儲系統分布到n台物理的節點上面,並且很好的協調和同步節點之間的數據讀寫一致性。這當然也得靠Erlang 無與倫比的並發特性才能做到。對於基於web的大規模應用文檔應用,分布式可以讓它不必像傳統的關系數據庫那樣分庫拆表,在應用代碼層進行大量的改動。
    CouchDB是面向文檔的數據庫,存儲半結構化的數據,比較類似lucene的index結構,特別適合存儲文檔,因此很適合CMS,電話本,地址本等應用,在這些應用場合,文檔數據庫要比關系數據庫更加方便,性能更好。
    CouchDB支持REST API,可以讓用戶使用JavaScript來操作CouchDB數據庫,也可以用JavaScript編寫查詢語句,我們可以想像一下,用AJAX技術結合CouchDB開發出來的CMS系統會是多麼的簡單和方便。
    CouchDB 的 JDBC 驅動程序是jcouchdb ,這是一個經過良好測試並且易於使用的Java庫,它會自動地將Java對象序列化、反序列化進CouchDB數據庫。選擇jcouchdb的另一個原因是它和CouchDB自身的API非常相似。
  • RavenDB
    RavenDB是基於Windows/.NET平台的NoSQL數據庫,支持Linq的開源文檔數據庫,旨在Window平台下提供一個高性能,結構簡單,靈活,可擴展NoSQL存儲。Raven將JSON文檔存在數據庫中。可以使用C#的Linq語法查詢數據。
    NBC News,美國國家廣播公司使用了RavenDB。
  • Terrastore
    Terrastore 是一個基於Terracotta(一 個業界公認的、快速的分布式集群組件)實現的高性能分布式文檔數據庫。可以動態從運行中的集群添 加/刪除節點,而且不需要停機和修改任何配置。支持通過http協議訪問Terrastore。Terrastore提供了一個基於集合的鍵/值接口來管 理JSON文檔並且不需要預先定義JSON文檔的架構。易於操作,安裝一個完整能夠運行的集群只需幾行命令。
  • OrientDB
    OrientDB 是兼具文擋數據庫的靈活性和圖形數據庫管理鏈接 能力的可深層次擴展的文檔-圖形數據庫管理系統。可選無模式、全模式或混合模式下。支持許 多高級特性,諸如ACID事務、快速索引,原生和SQL查詢功能。可以JSON格式導入、導出文檔。若不執行昂貴的JOIN操作的話,如同關系數據庫可在 幾毫秒內可檢索數以百記的鏈接文檔圖。

三、 列存儲(Wide Column Store/Column-Family)數據庫

列存儲數據庫將數據儲存在列族(column family)中,一個列族存儲經常被一起查詢的相關數據。舉個例子,如果我們有一個Person類,我們通常會一起查詢他們的姓名和年齡而不是薪資。這種情況下,姓名和年齡就會被放入一個列族中,而薪資則在另一個列族中。

列存儲查找速度快,可擴展性強,更容易進行分布式擴展,適用於分布式的文件系統。

適用的場景
1. 日志。因為我們可以將數據儲存在不同的列中,每個應用程序可以將信息寫入自己的列族中。
2. 博客平台。我們儲存每個信息到不同的列族中。舉個例子,標簽可以儲存在一個,類別可以在一個,而文章則在另一個。

不適用場景
1. 如果我們需要ACID事務。Vassandra就不支持事務。
2. 原型設計。如果我們分析Cassandra的數據結構,我們就會發現結構是基於我們期望的數據查詢方式而定。在模型設計之初,我們根本不可能去預測它的查詢方式,而一旦查詢方式改變,我們就必須重新設計列族。

產品:Cassandra、HBase

  • Cassandra
    Cassandra是一套開源分布式NoSQL數據庫系統,是一個混合型的非關系的數據庫,以Amazon專有的完全分布式的Dynamo為基礎,結合了 Google BigTable基於列族(Column Family)的數據模型。Cassandra的主要特點就是它不是一個數據庫,而是由一堆數據庫節點共同構成的一個分布式網絡服務,對 Cassandra 的一個寫操作,會被復制到其他節點上去,對Cassandra的讀操作,也會被路由到某個節點上面去讀取。對於一個Cassandra群集來說,擴展性能 是比較簡單的事情,只管在群集裡面添加節點就可以了。和其他數據庫比較,有三個突出特點:模式靈活、可擴展性、多數據中心。
    使用官方java驅動操作cassandra 非常簡單。  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved