1. 程式人生 > >NoSQL 知識彙總

NoSQL 知識彙總

簡介

Not Only SQL。彌補傳統是關係型資料庫的缺陷,滿足現下網際網路海量資料、高併發、低延遲和非結構化資料易擴充套件等需求。
傳統關係型資料庫的優勢:

  • 複雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常複雜的資料查詢。
  • 事務支援使得對於安全效能很高的資料訪問要求得以實現。

傳統的關係型資料庫的缺陷:

  1. 結構化資料;
  2. 在大資料量和多伺服器之上進行水平伸縮的限制;

NoSQL 的優勢:

  • 靈活的資料模型,可以處理非結構化/半結構化的大資料;
  • 可伸縮性(向上擴充套件與水平擴充套件);
  • 在不太影響效能的情況,就可以方便的實現高可用的架構;
  • 具有非常高的讀寫效能,尤其在大資料量下效能損耗很小,得益於其資料庫的結構簡單。

區別

SQL 和 NoSQL 對於如何儲存和檢索資料,都有不同的哲學。
對於SQL資料庫,所有資料都有一個固有的結構,傳統資料庫使用schema,即明確的定義,如何將資料插入到資料庫中。例如,表中給定的列只能限於整數,因此,此欄所記錄的資料將具有高度的標準化。一個SQL資料庫的剛性模式也使得對資料進行聚合變得相對容易,例如通過連線方式。

  • 1.儲存方式
    關係型資料庫是表格式的,因此儲存在表的行和列中。他們之間很容易關聯協作儲存,提取資料很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常儲存在資料集中,就像文件、鍵值對或者圖結構。
  • 2.儲存結構
    關係型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和內容。這一點對資料建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基於動態結構,使用與非結構化資料。因為Nosql資料庫是動態結構,可以很容易適應資料型別和結構的變化。
  • 3.儲存規範
    關係型資料庫的資料儲存為了更高的規範性,把資料分割為最小的關係表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料儲存在平面資料集中,資料經常可能會重複。單個數據庫很少被分隔開,而是儲存成了一個整體,這樣整塊資料更加便於讀寫。
  • 4.儲存擴充套件
    這可能是兩者之間最大的區別,關係型資料庫是縱向擴充套件,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料儲存在關係表中,操作的效能瓶頸可能涉及到多個表,需要通過提升計算機效能來克服。雖然有很大的擴充套件空間,但是最終會達到縱向擴充套件的上限。而Nosql資料庫是橫向擴充套件的,它的儲存天然就是分散式的,可以通過給資源池新增更多的普通資料庫伺服器來分擔負載。
  • 5.查詢方式
    關係型資料庫通過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的標準用法。而Nosql查詢以塊為單元操作資料,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關係型資料庫表中主鍵的概念對應Nosql中儲存文件的ID。關係型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的資料訪問模式。
  • 6.事務
    關係型資料庫遵循ACID規則,而 NoSQL 資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關係型資料庫的資料強一致性,所以對事務的支援很好。關係型資料庫支援對事務原子性細粒度控制,並且易於回滾事務。而NoSQL 資料庫是在CAP(一致性、可用性、分割槽容忍度)中任選兩項,因為基於節點的分散式系統中,很難全部滿足,所以對事務的支援不是很好,雖然也可以使用事務,但是並不是 NoSQL 的閃光點。
  • 7.效能
    關係型資料庫為了維護資料的一致性付出了巨大的代價,讀寫效能比較差。在面對高併發讀寫效能非常差,面對海量資料的時候效率非常低。而Nosql儲存的格式都是key-value型別的,並且儲存在記憶體中,非常容易儲存,而且對於資料的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫效能。
  • 8.授權方式
    付費與開源的區別。

使用NoSQL,資料可以以無模式或自由格式儲存,任何資料都可以儲存在任何記錄中。在NoSQL資料庫中,你將找到四個用於儲存資料的常用模型。

無模式資料儲存在以下場景中是有用的:

  1. 希望快速訪問資料,更關心訪問速度和簡單性,而不是可靠的事務或一致性。
  2. 正在儲存大量的資料,並且不想將自己鎖在一個模式中,因為稍後更改模式可能會比較緩慢和痛苦。
  3. 正在接收來自一個或多個源的非結構化資料,希望將資料儲存在原始表單中,以獲得最大的靈活性。
  4. 希望將資料儲存在分層結構中,但希望這些層次結構由資料本身描述,而不是外部模式。NoSQL允許資料以隨意的方式進行自我引用,這對於SQL資料庫來說更加複雜。

分類

主流的NOSQL資料庫主要分為4類:
鍵值(Key-Value)儲存資料庫
這一類資料庫主要會使用到一個雜湊表,這個表中有一個特定的鍵和一個指標指向特定的資料。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下。例如:Redis、Memcache、DynamoDB等

列儲存(Wide-Column)資料庫
列儲存資料庫,也可以稱為 BigTable 實現(BigTable-implementations),通常是用來應對分散式儲存的海量資料。主鍵指向多個列,這些列是由列家族來安排的。如:Cassandra, HBase。

文件型(Document)資料庫
文件型資料庫的靈感是來自於Lotus Notes辦公軟體的,而且它同第一種鍵值儲存相類似。該型別的資料模型是版本化的文件,半結構化的文件以特定的格式儲存,比如JSON。文件型資料庫可 以看作是鍵值資料庫的升級版,允許之間巢狀鍵值。而且文件型資料庫比鍵值資料庫的查詢效率更高。如:CouchDB, MongoDB。

圖形(Graph)資料庫
圖形結構的資料庫同其他行列以及剛性結構的SQL資料庫不同,它是使用靈活的圖形模型,並且能夠擴充套件到多個伺服器上。NOSQL資料庫沒有標準的查詢語言(SQL),因此進行資料庫查詢需要制定資料模型。許多NOSQL資料庫都有REST式的資料介面或者查詢API。 如:OrientDB, Neo4J, Titan等。
其他還有類似物件資料庫,XML資料庫。另外很多NOSQL資料庫其實是支援多模型的,比如OrientDB同時支援Key-Value, Document, Graph, Object資料庫。

MongoDB

優點

  1. 面向文件儲存,儲存格式 BSON 類似 JSON,資料操作起來比較簡單和容易;
  2. 熱資料存放記憶體,查詢效率非常高;支援比傳統關係型資料庫更高的寫負載,擁有更高的插入速度;
  3. 處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。
  4. 高可用性,設定M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實現節點(資料中心)故障轉移。
  5. 快速的查詢,MongoDB支援二維空間索引,比如管道,因此可以快速及精確的從指定位置獲取資料。MongoDB在啟動後會將資料庫中的資料以檔案對映的方式載入到記憶體中。如果記憶體資源相當豐富的話,這將極大地提高資料庫的查詢速度。
  6. 非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載從而導致效能下降,由於 MongoDB 的弱資料結構模式,新增1個新欄位不會對舊錶格有任何影響,整個過程會非常快速。
  7. 資料之間沒有耦合性,所以非常容易水平擴充套件。自帶shard功能;
  8. 支援MapReduce,聚合操作效能很高支援MapReduce,聚合操作效能很高

缺點

  • 不支援事務;
  • MongoDB 滿足效能需求,但不支援關聯查詢;
  • MongoDB 佔用空間過大;
  • MongoDB 沒有成熟的維護工具(?)。

圖資料庫簡介