初識Nosql


ref:http://www.runoob.com/mongodb/nosql.html

   https://blog.csdn.net/testcs_dn/article/details/51225843

什么是NoSQL?

  百度百科中:NoSQL,泛指非關系型的數據庫。中文名:非關系型數據庫,外文名:NoSQL=Not Only SQL。

  看 Wikipedia中:A NoSQL (originally referring to "non SQL" or "non relational") database provides a mechanism for storage and retrieval of data which is modeled in means other than the tabular relations used in relational databases.

  NoSQL(最初指的"非 SQL"或"非關系")數據庫提供了一種機制用於存儲和檢索模型中的數據,不同於關系數據庫中使用的表格關系的方式。

  再看Wiki中參考的NoSQL終極指南(nosql-database.org中說的:NoSQL DEFINITION:Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable.

  NoSQL的定義:下一代數據庫主要是解決一些要點:非關系型,分布式的,開放源碼和支持橫向擴展。

  The original intention has been modern web-scale databases. The movement began early 2009 and is growing rapidly. Often more characteristics apply such as: schema-free, easy replication support, simple API, eventually consistent / BASE (not ACID), a huge amount of data and more. So the misleading term "nosql" (the community now translates it mostly with "not only sql") should be seen as an alias to something like the definition above. 

  初衷是現代網絡規模的數據庫。該運動始於2009年初,並正在迅速增長。通常都支持的特性(共同特征),如:無架構開放架構(不需要預定義模式),易於復制,簡單的API,最終一致/ 基礎(不支持ACID特性),支持海量數據存儲。所以,誤導性術語“的NoSQL”(現在社會把它翻譯大多為“不僅是SQL”),應被視為類似於上面的定義的別名。

前世今生

  NoSQL最近幾年才火起來,並且快速增長,那么它從什么時候開始有的呢?

  Such databases have existed since the late 1960s, but did not obtain the "NoSQL" moniker until a surge of popularity in the early twenty-first century。

  早啦,從60年代后期這樣的數據庫已經存在,但並沒有取得“NoSQL”的綽號。

  只是以前的應用場景更適合使用關系型的數據庫,所以NoSQL類型的數據庫不被大多數人需要,不被大多數人所知。

  NoSQL一詞最早出現於1998年,它是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關系型數據庫(他認為,由於NoSQL悖離傳統關系數據庫模型,因此,它應該有一個全新的名字,比如“NoREL”或與之類似的名字)。
  2009年,Last.fm的Johan Oskarsson發起了一次關於分布式開源數據庫的討論,來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時的NoSQL主要指非關系型、分布式、不提供ACID的數據庫設計模式。
  2009年在亞特蘭大舉行的“no:sql(east)”討論會是一個里程碑,其口號是"select fun, profit from real_world where relational=false;"。因此,對NoSQL最普遍的解釋是“非關系型的”,強調鍵值存儲和文檔數據庫的優點,而不是單純地反對關系型數據庫。

誕生的原因

  隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。

  今天我們可以通過第三方平台(如:Google,Facebook等)可以很容易的訪問和抓取數據。用戶的個人信息,社交網絡,地理位置,用戶生成的數據和用戶操作日志已經成倍的增加。我們如果要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

  

實例

  社會化關系網:

  Each record: UserID1, UserID2 
  Separate records: UserID, first_name,last_name, age, gender,... 
  Task: Find all friends of friends of friends of ... friends of a given user.

  Wikipedia 頁面 :

  Large collection of documents 
  Combination of structured and unstructured data 
  Task: Retrieve all pages regarding athletics of Summer Olympic before 1950.

分布式系統

  分布式系統(distributed system)由多台計算機和通信的軟件組件通過計算機網絡連接(本地網絡或廣域網)組成。

  分布式系統是建立在網絡之上的軟件系統。正是因為軟件的特性,所以分布式系統具有高度的內聚性和透明性。

  因此,網絡和分布式系統之間的區別更多的在於高層軟件(特別是操作系統),而不是硬件。

  分布式系統可以應用在不同的平台上如:Pc、工作站、局域網和廣域網上等。

分布式計算的優點

  可靠性(容錯) :

  分布式計算系統中的一個重要的優點是可靠性。一台服務器的系統崩潰並不影響到其余的服務器。

  可擴展性:

  在分布式計算系統可以根據需要增加更多的機器。

  資源共享:

  共享數據是必不可少的應用,如銀行,預訂系統。

  靈活性:

  由於該系統是非常靈活的,它很容易安裝,實施和調試新的服務。

  更快的速度:

  分布式計算系統可以有多台計算機的計算能力,使得它比其他系統有更快的處理速度。

  開放系統:

  由於它是開放的系統,本地或者遠程都可以訪問到該服務。

  更高的性能:

  相較於集中式計算機網絡集群可以提供更高的性能(及更好的性價比)。

分布式計算的缺點

  故障排除:

  故障排除和診斷問題。

  軟件:

  更少的軟件支持是分布式計算系統的主要缺點。

  網絡:

  網絡基礎設施的問題,包括:傳輸問題,高負載,信息丟失等。

  安全性:

  開放系統的特性讓分布式計算系統存在着數據的安全性和共享的風險等問題。

RDBMS vs NoSQL

  RDBMS 
  - 高度組織化結構化數據 
  - 結構化查詢語言(SQL) 
  - 數據和關系都存儲在單獨的表中。 
  - 數據操縱語言,數據定義語言 
  - 嚴格的一致性
  - 基礎事務

  NoSQL 
  - 代表着不僅僅是SQL
  - 沒有聲明性查詢語言
  - 沒有預定義的模式
  -鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
  - 最終一致性,而非ACID屬性
  - 非結構化和不可預知的數據
  - CAP定理 
  - 高性能,高可用性和可伸縮性

  

CAP定理(CAP theorem)

  在計算機科學中, CAP定理(CAP theorem), 又被稱作布魯爾定理(Brewer's theorem), 它指出對於一個分布式計算系統來說,不可能同時滿足以下三點:

  • 一致性(Consistency) (所有節點在同一時間具有相同的數據)
  • 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)

  CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。

  因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三大類:

  • CA - 單點集群,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
  • CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
  • AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。

  

NoSQL數據庫的四大分類 

  鍵值(Key-Value)存儲數據庫

  這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.

  列存儲數據庫

  這部分數據庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.

  文檔型數據庫

  文檔型數據庫的靈感是來自於Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。

  圖形(Graph)數據庫

  圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個服務器上。NoSQL數據庫沒有標准的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.

  因此,我們總結NoSQL數據庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對數據庫性能要求較高;4、不需要高度的數據一致性;5、對於給定key,比較容易映射復雜值的環境。

四大分類對比分析

  

NoSQL的優點/缺點

  優點:

  • - 高可擴展性
  • - 分布式計算
  • - 低成本
  • - 架構的靈活性,半結構化數據
  • - 沒有復雜的關系

  缺點:

  • - 沒有標准化
  • - 有限的查詢功能(到目前為止)
  • - 最終一致是不直觀的程序

BASE

  BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。

  CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。

  BASE是NoSQL數據庫通常對可用性及一致性的弱要求原則:

  • Basically Availble --基本可用
  • Soft-state --軟狀態/柔性事務。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
  • Eventual Consistency -- 最終一致性, 也是是 ACID 的最終目的。

ACID vs BASE

ACID BASE
原子性(Atomicity) 基本可用(Basically Available)
一致性(Consistency) 軟狀態/柔性事務(Soft state)
隔離性(Isolation) 最終一致性 (Eventual consistency)
持久性 (Durable)  

Nosql和關系型數據庫的區別

1.存儲方式

  關系型數據庫是表格式的,因此存儲在表的行和列中。他們之間很容易關聯協作存儲,提取數據很方便。而Nosql數據庫則與其相反,他是大塊的組合在一起。通常存儲在數據集中,就像文檔、鍵值對或者圖結構。 

2.存儲結構

  關系型數據庫對應的是結構化數據,數據表都預先定義了結構(列的定義),結構描述了數據的形式和內容。這一點對數據建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些數據比較困難。而Nosql數據庫基於動態結構,使用與非結構化數據。因為Nosql數據庫是動態結構,可以很容易適應數據類型和結構的變化。 

3.存儲規范

  關系型數據庫的數據存儲為了更高的規范性,把數據分割為最小的關系表以避免重復,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,數據管理就顯得有點麻煩。而Nosql數據存儲在平面數據集中,數據經常可能會重復。單個數據庫很少被分隔開,而是存儲成了一個整體,這樣整塊數據更加便於讀寫

 4.存儲擴展

  這可能是兩者之間最大的區別,關系型數據庫是縱向擴展,也就是說想要提高處理能力,要使用速度更快的計算機。因為數據存儲在關系表中,操作的性能瓶頸可能涉及到多個表,需要通過提升計算機性能來克服。雖然有很大的擴展空間,但是最終會達到縱向擴展的上限。而Nosql數據庫是橫向擴展的,它的存儲天然就是分布式的,可以通過給資源池添加更多的普通數據庫服務器來分擔負載。

 5.查詢方式

  關系型數據庫通過結構化查詢語言來操作數據庫(就是我們通常說的SQL)。SQL支持數據庫CURD操作的功能非常強大,是業界的標准用法。而Nosql查詢以塊為單元操作數據,使用的是非結構化查詢語言(UnQl),它是沒有標准的。關系型數據庫表中主鍵的概念對應Nosql中存儲文檔的ID。關系型數據庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的數據訪問模式。

 6.事務

  關系型數據庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql數據庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關系型數據庫的數據強一致性,所以對事務的支持很好。關系型數據庫支持對事務原子性細粒度控制,並且易於回滾事務。而Nosql數據庫是在CAP(一致性、可用性、分區容忍度)中任選兩項,因為基於節點的分布式系統中,很難全部滿足,所以對事務的支持不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。

 7.性能

  關系型數據庫為了維護數據的一致性付出了巨大的代價,讀寫性能比較差。在面對高並發讀寫性能非常差,面對海量數據的時候效率非常低。而Nosql存儲的格式都是key-value類型的,並且存儲在內存中,非常容易存儲,而且對於數據的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫性能。

 8.授權方式

  關系型數據庫通常有SQL Server,Mysql,Oracle。主流的Nosql數據庫有redis,memcache,MongoDb。大多數的關系型數據庫都是付費的並且價格昂貴,成本較大,而Nosql數據庫通常都是開源的。

誰在使用

  現在已經有很多公司使用了 NoSQL:

  • Google
  • Facebook
  • Mozilla
  • Adobe
  • Foursquare
  • LinkedIn
  • Digg
  • McGraw-Hill Education
  • Vermont Public Radio


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM