什麼是NoSQL資料庫?

Narasimha_Karumanchi發表於2017-06-28

什麼是NoSQL?

    NoSQL涵蓋了各種不同的資料庫技術,這些技術是根據現代應用程式的要求而開發的。
  1. 開發人員正在使用一些建立大量的、快速變化的資料型別的應用程式,資料型別有結構化的,半結構化的,非結構話的和多型的樣式
  2. 12到18個月的瀑布發展週期已經過去了。現在,小團隊在沒日沒夜地工作著,軟體快速更新換代,每週或兩週推送程式碼,甚至會有每天多次的推送程式碼,以更新軟體
  3. 曾經服務於有限受眾的應用程式,現在必須一直處於開放狀態提供服務,可從不同的裝置訪問並且來自世界各地的訪問者多達百萬級別
  4. 現在,各個組織都在使用開源軟體、商品伺服器和雲端計算,而不是大型微控制器伺服器和儲存基礎設施的橫向擴充套件架構
    關係型資料庫的設計不是為了應對現有應用程式的規模和速度的挑戰,也不是為了利用當代可用的商品儲存和處理能力而建立的。

NoSQL資料庫的型別

  • document databases :每一組key/value,其中value可以是複雜的資料結構,可以稱之為文件。文件可以包括不同的鍵值對,或者鍵陣列,甚至是巢狀關係的文件 例如MongoDB
  • Graph stores 是被用來儲存資料網路的資訊,例如社交連線。Graph stores包括Neo4J和Girapha
  • key-vaule stores是最簡單的NoSQL資料庫。每一個單獨的項以key和value的形式儲存在資料庫裡。典型的這種資料庫有:Riak和BerkeleyDB。有些key-value stores,例如Redis, 允許value有特定的資料型別
  • wide-column stores,例如 Cassandra和Hbase, 優化了大型資料庫的查詢, 將資料以列的形式儲存而不是傳統的以行形式儲存。

NoSQL的優勢

    當和關係型資料庫相比時,NoSQL資料擁有更好的可擴充套件性和更牛逼的效能,其資料模型解決了關係型資料模型未解決的若干問題:
  1. 大量快速變化的結構化,半結構化與非結構化的資料
  2. 表結構的快速變化,需求的不斷更新
  3. 易於使用和靈活的物件導向程式設計
  4. 地理位置分散的橫向擴充套件架構,而不是昂貴的單片架構

Dynamic schema 動態的模式

    關係型資料庫需要你在新增資料之前就需要將模式定義完成。例如,如果你想儲存你的客戶相關資訊,如電話號碼,姓名,地址,城市和一些其他的相關狀態,資料庫需要提前知道你要儲存的是什麼。
    這是不適合快速的開發方式,因為每一需要新的特徵的時候(欄位),資料庫的模式就需要改變。因此,如果你決定開發一些新的迭代,除了地址和電話號碼外,還要儲存客戶喜愛的專案,那麼你需要將這個列新增到資料庫中,這樣你整個資料庫就要遷移到新的模式中(schema),在遷移的時候,資料庫伺服器還必須處於下線狀態,不可被使用。
如果資料庫很大,那麼這將是一個漫長的過程。如果你的應用儲存需要頻繁地改變儲存的資料,因為這種迭代非常頻繁,所以那種模式變化導致的資料遷移也會十分頻繁而漫長。並且使用關係型資料庫無法有效地處理完全非結構化或未知的資料。
    構建NoSQL資料允許在沒有預先定義模式的情況下插入資料。這樣可以輕鬆地實時地進行重大應用程式的更改,而不必擔心服務中斷的情況,這意味著開發的速度更快,程式碼整合更可靠,而且需要更少的資料庫管理員時間。開發人員通常不得不新增應用程式程式碼來強制執行資料質量的控制,例如要求存在特定欄位、資料型別或允許的值,在更復雜的NoSQL中,允許資料庫中應用驗證規則,允許使用者在資料之間實施控制管理。同時還能保證資料庫的動態模式。

Auto-sharding 自動分片

    因為關係型資料庫的結構化,他們通常是垂直擴充套件的,單個伺服器必須依託於整個資料庫,以確保跨表聯結和支援事務。這樣做將會非常昂貴,限制了規模,併為資料庫基礎架構創造了相對較少的故障點。支援快速增長資料的應用程式解決方案是通過新增伺服器而不是將更多容量集中在單個伺服器中來水平擴充套件。
    通過SQL資料庫可以實現跨越多個伺服器例項的“分片”資料庫,但通常通過SAN和其他複雜的安排來實現,從而使硬體充當單個伺服器。 由於資料庫本身不提供此功能,開發團隊將承擔在多臺機器上部署多個關聯式資料庫的工作。 資料自動儲存在每個資料庫例項中。 開發應用程式程式碼來分發資料,分發查詢,並在所有資料庫例項中聚合資料結果。 必須開發附加程式碼來處理資源故障,在不同資料庫之間執行連線,用於資料重新平衡,複製和其他要求。 此外,使用手動分片時,關聯式資料庫的許多好處(如事務完整性)會受到損害或消除。
    另一方面,NoSQL資料庫通常支援自動分片,這意味著他們可以在任意多的伺服器上自動地傳播資料,而不需要應用程式意識到伺服器的組成形式。資料和查詢負載在伺服器之間自動平衡,當一個伺服器掛掉的時候,他可以快速透明地被替換掉並且應用程式不知情的情況下。
    雲端計算使這一點變得更加容易,亞馬遜網路服務提供商幾乎可以提供無限容量的需求,並且負責所有的基礎架構管理任務。開發人員不再需要構建複雜昂貴的平臺來支援他們的應用程式,並且可以專注於編寫應用程式程式碼。商品伺服器可以提供與單個高階伺服器相同的處理和儲存功能,但只需要一部分價格即可。

Replication 複製

    大多數NoSQL資料還支援自動的資料複製,以在發生中斷或者計劃維護事件時保持可用性。更復雜的NoSQL資料庫還支援完全自我恢復功能,提供自動故障轉移和恢復,以及在多個地理區域分發資料庫以承受區域故障並實現資料本地化的能力。與關聯式資料庫不同,NoSQL資料庫通常不需要單獨的應用程式或昂貴的附加元件來實現複製。

Integrated caching 整合快取

    很多產品為SQL資料庫提供快取層,這些系統可以顯著提高讀取效能,但他們不會改善寫入功能,並且還會增加部署的操作複雜性。如果你的應用由讀取為主導,則可以考慮分散式快取,但是如果應用程式只有適度的寫入功能,則分散式快取則可能無法提高終端使用者的整體體驗,並將增加管理快取無效的複雜性。

    許多NoSQL資料庫技術具有出色的整合快取功能,可以儘可能多在系統記憶體中儲存常用資料,並且無需單獨的快取層。一些NoSQL資料庫還為需要最高吞吐量和最低延遲的工作負載提供完全管理的整合式記憶體資料庫管理層。

NoSQL與SQL的對比


NoSQL和SQL對比

 

SQL databases

NoSQL databases

型別

只有一種形式(SQL database)

許多種不同的型別,包括鍵值對儲存,文件儲存,圖形儲存

發展歷史

開發於1970s

開發於2000年代末,以處理SQL資料庫的侷限性,特別是可擴充套件性,多結構化資料,地理位置分佈,以及應用程式的快速更新換代

舉例

MySQL,Oracle,Postgres

MongoDB,Hbase,Neo4j,Redis,Memcached

資料儲存模式

每個記錄(例如“僱員”)以表的形式儲存為行,每列儲存有關該記錄的特定資料(例如“年齡”,“聘用日期”),非常像電子表格。相關資料儲存在單獨的表中,然後在執行更復雜的查詢時連線在一起。例如,“辦公室”可能儲存在一個表中,“員工”可以儲存在另一個表中。當使用者想要查詢員工的工作地址時,資料庫引擎將“員工”和“辦公室”表連線在一起,以獲取所需的所有資訊。

基於資料庫型別的不同。例如,鍵值對儲存和SQL資料庫類似,但只有兩列(key,value),更復雜的資訊有時會以blob在value列儲存。文件資料庫完全取消了表和行的模型,將所有相關的資料儲存在一起,以json或其他格式的儲存在單個文件中。

表模式

結構和資料型別需要提前確定。如果要儲存資料的新的資訊,整個表必須要修改,在此期間資料庫必須offline

通常是動態的,具有一些執行資料驗證規則。應用程式可以隨時新增新的欄位,與SQL錶行不同,可根據需要將不同的資料儲存在一起,對某些資料庫(寬列儲存),動態地新增新欄位更具有挑戰性

擴充套件

垂直新增伺服器。

水平新增伺服器

是否開源?

開源(MySQL)與非開源(Oracle)混合

開源

是否支援事務?

當然

有的情況是支援的(文件資料庫)

資料的操作

專門的語言,select,insert,update

通過物件導向的api

資料一致性

當然

依賴於具體的產品。MongoDB具有可讀性的一致性,其他的提供最終的一致性




相關文章