大數據時代下的新寵:是時候熟悉NoSQL數據庫了!
本文轉載自公眾號“讀芯術”(ID:AI_Discovery)
在大數據時代,數據是信息系統的核心,數據組織和運營的效率是任何公司都關心的問題,業務專長和對現有技術解決方案的理解是非常必要的。因此,公司必須同時繼續評估和選擇能夠滿足其未來需求和支持其增長的數據庫。
關系數據庫已經被用于存儲數據幾十年了,它們仍是許多用例的可行解決方案。而NoSQL數據庫則是針對關系數據庫技術的局限性而創建的。
與關系型數據庫相比,NoSQL數據庫具有更強的可擴展性和更好的性能,它彌補了關系型數據庫的一些不足。
NoSQL數據庫旨在解決大數據環境中的海量,多源和多格式的數據處理問題。它們提供了一種新的方法來滿足容量需求以及新的數據類型。如今,NoSQL數據庫的數量變得越來越重要。了解了它們之間的差異是至關重要的,你才能采用正確的技術進行正確的應用。
本文將闡述從RDBMS遷移到NoSQL的困難、過程和好處。
1. 簡介
SQL:
SQL是結構化查詢語言的縮寫。IT工程師在大型關系數據庫(DBMS)中快速搜索信息已經有很長一段時間了。
SQL如今被廣泛使用,因為它是最結構化、最快的數據庫組織和查詢設備之一;不同的名字代表不同的改進版本,如Oracle的MySQL和微軟的SQL Server。此外,SQL具有預定義的結構和模式,是許多公司最推薦的選擇。
NoSQL:
“NoSQL”這個縮略語有兩種不同的解釋,目前尚不明確:
- 對有些人來說是“No SQL”,也就是說,使用了另一種不同于SQL的查詢語言。
- 對于其他人,它不僅是“SQL”,也就是說,是SQL與其他信息檢索工具的結合使用。
這個術語既與技術特征有關,也與20世紀10年代出現的歷史性一代DBMS有關。導致NoSQL發明的主要原因是,它解決了這樣一個問題,即一個網站上的同一個數據庫可以在全世界范圍內被數百萬用戶同時使用;像亞馬遜這樣的公司就存在這種典型問題……
筆者試圖通過NoSQL來降低查詢語言的復雜性,簡化數據庫的體系結構。這些數據庫包括面向列、面向文檔、面向圖形和面向鍵/值的數據。NoSQL由各種產品組成,每個產品都有一組獨特的功能。
主要差別:
- SQL數據庫有一個預定義的模式,而NoSQL數據庫有一個用于非結構化數據的動態模式。
- SQL數據庫是可垂直擴展的,而NoSQL數據庫是可水平擴展的。SQL數據庫是通過增加CPU、RAM或SSD等硬件的能力來擴展的。
- NoSQL數據庫通過增加數據服務器的數量來減少負載。這就像在同一棟建筑上增加更多的樓層,而不是在鄰近地區增加更多的建筑。
- SQL數據庫使用SQL(結構化查詢語言)來定義和操作數據,這是非常強大的。在NoSQL數據庫中,查詢的重點是文檔收集。有時也稱為UnQL(非結構化查詢語言)。在不同的NoSQL數據庫之間,使用UnQL的語法差異很大。
- SQL數據庫是基于表的數據庫,而NoSQL數據庫是基于鍵值對的數據庫。這意味著SQL數據庫以表的形式表示數據,表由表示數據的一定數量的行組成,而NoSQL數據庫是鍵值對、文檔、圖形數據庫等的集合。
2. 歷史因素
(1) 關系型DBMS的歷史支配地位
- 20世紀70年代創建的關系型DBMS已經逐漸成為主流, 20世紀90年代初成為了非常普遍的主流數據庫范式。
- 在20世紀90年代,許多物流公司的銷售人員開始使用它來存儲業務數據。事實上,他們既沒有鼠標,也沒有用戶界面來搜索存儲在服務器上的某些信息,服務器通常由專業線連接并且相距很遠,它們用于通過鍵盤輸入SQL命令,并且能夠在幾秒內檢索到特定產品或原材料可用性的相關信息。
- 出現了其他幾種數據庫模型,如面向對象的數據庫管理系統、層次數據庫管理系統、對象關系數據庫管理系統,但它們的使用非常有限。
- 從本世紀初開始,隨著谷歌、亞馬遜等大型互聯網公司的發展,出現了大量的非結構化數據,其增長速度遠遠超過不再符合RDBMS關系模式的結構化數據。集群計算也得到了發展,關系模型的主導地位由于其在新實踐上的限制受到了質疑。
(2) NoSQL模型的先驅
大型web公司必須處理非常大的數據量,這就是為什么它們首先要面對傳統關系型DBMS的固有限制。
這些系統嚴格應用ACID屬性(原子性、一致性、隔離性、持久性),通常設計為在單臺計算機上運行,很快就出現了可伸縮性問題。為了滿足這些限制,一些公司已經開始開發自己的數據庫管理系統,這些系統可以在分布式硬件架構上運行,可以處理大量數據:
- 谷歌(BigTable),
- 亞馬遜(DynamoDB),
- LinkedIn(Voldemort ),
- Facebook (Cassandra和HBase),
- 百度(Hypertable)
通過簡單增加服務器數量,性能保持良好,這是降低成本的合理解決方案,特別是如果收入隨著活動的增長而增長的話。
3. 流行的數據庫
為了選擇合適的管理系統,了解市場上存在什么是很重要的。看看下面5個流行的SQL和NoSQL數據庫,其中有付費的也有免費的。
(1) SQL數據庫產品:
- MySql:它是免費的,即使是免費的數據庫引擎也提供了很多功能。
- Postgres:這個數據庫管理引擎是可擴展的,可以處理tb級的數據,具有各種預定義的功能。
- Oracle:Oracle數據庫管理工具集最新的創意和功能于一身,非常強大。
- SQL Server:非常快速和穩定,與微軟的其他產品配合得很好。
- SQLite:SQLite數據庫非常靈巧,并且可以快速地設置,它還可以用于在智能手機應用程序(iPhone或Android)的實際數據庫中存儲數據。
(2) NoSQL數據庫產品:
- MongoDB:MongoDB是一個靈活/可靠的數據庫,它會把讀者吸引到NoSQL的世界中來。管理和維護非常簡單快捷。
- Hbase:它是一個面向列的數據庫,有助于提高查詢性能和集合。
- Cassandra:Cassandra提供的線性可伸縮性,允許通過簡單地添加/刪除服務器來輕松地擴展/縮小集群。
- Redis:使用非常簡單和直接。下載Redis,并在接下來的五分鐘內開始使用它。
- CouchDb:由于CouchDB能夠存儲序列化(JSON格式)的非結構化數據和Restful HTTP API,因此它非常適合用于Web和移動應用程序。
4. NoSQL數據庫設計
NoSQLDBMS的主要特點,在于支持對大量數據的操作和水平可伸縮性。然而,目前大多數公司面臨的困難是,如何用最適當的技術解決問題,使應用作出反應。
圖源:unsplash
要解決這個問題,首先要很好地理解不同類型的NoSQL數據庫。
有一個普遍的誤解,所有的NoSQL數據庫都是平等創建的。實際上,這些數據庫可以分為四類:面向文檔的數據庫、鍵/值數據庫、列數據庫和面向圖形的數據庫。它們都有一個共同點:支持比傳統關系數據庫更靈活和更動態的模型。
事實上,每個類別都有自己的屬性和限制。沒有數據庫可以解決所有問題。必須根據項目的需要選擇數據庫。
必須考慮將操作什么類型的數據,以及應用程序最終將如何使用這些數據。
(1) 面向文檔的數據庫:混合結構
面向文檔的NoSQL數據庫將數據存儲和提取為鍵/值對,但是值部分存儲為文檔。文檔以JSON或XML格式存儲。
MongoDB, Apache CouchDB, MarkLogic是面向文檔的數據庫
(2) 鍵/值數據庫:
面向鍵值的數據庫有大量的鍵和值散列。它代表了NoSQL數據庫的最簡單形式。將唯一的鍵與數據中的值相關聯,目的是基于相對簡單的數據集極大地提高應用程序的性能。
Redis, Riak, Memcached 和 Aerospike 就是鍵值數據庫的例子。
(3) 列數據庫:
列數據庫將數據保存在具有大量列的表中。每個存儲塊包含來自單個列的數據,并且每個列被單獨處理。它們在諸如COUNT、SUM、AVG、MAX等聚合查詢上有很高的性能,因為數據很容易從列中取出。
HBase, Cassandra 和 Accumulo 就是列數據庫的例子。
(4) 面向圖形的數據庫:
基于圖的數據庫是一種網絡數據庫,它將數據元素存儲在“圖”結構中,使得在節點之間創建關聯成為可能,最終成為推薦引擎或社交網絡的基礎。
從圖形數據庫中可以獲得很多信息。例如,可以使用圖形技術根據不同人的興趣來確定他們之間的關系。
圖源:neo4j.
Neo4J, InfiniteGraph 和 FlockDB 就是面向圖形數據庫的例子。
5. 為應用程序選擇適當的數據庫類型的5個標準
如何選擇哪種類型的數據庫最適合一個項目?可以根據以下清單做決定:
- 要存儲的數據類型:SQL數據庫不適合分層數據存儲。但是,NoSQL數據庫更適合分層數據存儲,因為它遵循鍵值對方法或圖方法。NoSQL數據庫是大型數據集的首選。
- 可伸縮性:在大多數情況下,SQL數據庫是可垂直伸縮的。可以通過增加單個服務器上的處理器、RAM、SSD等來管理增加的負載。另一方面,NoSQL數據庫是可水平伸縮的。可以簡單地將一些額外的服務器添加到NoSQL數據庫基礎設施中來處理繁重的數據流。因此,可以根據設備選擇適合的數據庫類型。
- 高度事務性應用程序:SQL數據庫更穩定并且可以保證原子性和數據完整性,因此更適合密集使用的事務類型的應用程序。雖然可以將NoSQL用于事務性目的,但它仍然不能與SQL相提并論,但可以用于復雜的事務性應用程序。
- 復雜查詢:SQL數據庫非常適合需要很多查詢的環境,而NoSQL數據庫不適合復雜查詢。所以NoSQL中的查詢不如SQL查詢語言強大。
- 屬性:SQL數據庫強調ACID屬性(原子性、一致性、隔離性、持久性),而NoSQL數據庫遵循Brewers CAP定理(一致性、可用性和分區容限)。
6. 從RDBMS轉向NoSQL
無論選擇哪種NoSQL數據庫設計,將數據遷移到其中都會遇到一些嚴峻的挑戰。NoSQL中數據模型的設計具有額外的復雜性,你需要知道數據的最終用途。僅僅知道應用程序將處理賬單和客戶信息是不夠的,還必須知道這些數據將如何展示給最終用戶。
因此,NoSQL數據庫中的數據建模除了需要對最終用戶的使用有深入的了解外,還需要真正的技術專長。
圖源:unsplash
是時候用NoSQL解決方案替換SQL了嗎?
在筆者看來,這是一個很難回答的問題。因為在大多數情況下,不是用NoSQL解決方案替換SQL,而是在應用程序和用例顯示需要更改時,從一種解決方案轉換到另一種解決方案。
通常,在構建現代Web和移動應用程序時,對靈活性和可伸縮性的需求將推動這種轉變。
許多公司試圖在其web應用程序中支持負載,因此選擇簡單地將web服務器添加到負載平衡器之后以支持更多用戶。
毫無疑問,在日益重要的云計算世界中,擴展能力是一個基本的競爭優勢,可以輕松地添加或刪除虛擬機實例,以滿足變化不定的需求。
關系型數據庫(RDBMS)不允許簡單的擴展,也不提供靈活的數據模型。管理更多的用戶意味著添加更大的服務器,而大型服務器非常復雜和昂貴,不像低成本的硬件、“商品硬件”和云架構。
組織開始看到現有或新應用程序的關系數據庫的性能問題。特別是隨著用戶數量的日益增加,他們意識到對更快速、更靈活的數據庫的需求變得非常重要。是時候轉移到NoSQL了!
從SQL到NoSQL的轉換需要哪些主要步驟?
應用程序/項目可能因每個組織而有很大的差異,因此轉換將取決于使用用例。以下是一些關于過渡的通用準則:
(1) 理解應用的核心需求
以下是與NoSQL數據庫的需求相對應的一些要求:
- 可擴展性
- 快速的應用程序開發:不斷變化的市場需求和持續的數據修改
- 性能穩定:響應時間短,可帶來更好的用戶體驗
- 運行可靠性:管理錯誤的高可用性,對應用程序的影響最小,并且集成了監視API以便更好維護
(2) 了解NoSQL提供的不同類型
如前所述,有不同類型的NoSQL數據庫管理系統。例如面向文檔的NoSQL數據庫—Couchbase和MongoDB是兩個最著名和最廣泛采用的例子。
此外,Cassandra可能也是一個解決方案,可以使用它的柱狀模型進行數據分析。Neo4j是一個圖形數據庫,對于需要存儲實體間關系的應用程序來說,它可能是一個完美的數據庫。
(3) 建立一個原型
一旦縮小了數據庫類型的可能選擇范圍,就可以嘗試開發一個集成了應用程序主要特征的原型。這個原型將幫助評估響應時間、吞吐量方面的性能和易于擴展的能力。
(4) 文檔建模與開發
對于面向文檔的數據庫,請花幾天時間從固定的表格圖開始對數據建模,以獲取靈活的文檔模型。
(5) 部署然后生產
操作穩定性是交互式web應用程序的一個非常重要的方面。對部署進行一次又一次的測試,就像對通常使用傳統RDBMS系統的應用程序進行測試一樣。
(6) 緊跟最新趨勢
今天,有大量的高質量培訓提供了NoSQL的實踐課程,確保NoSQL成功實現的最佳方法是更新最新版本。
不要擔心,你會很容易接受某些NoSQL技術,特別是如果熟悉JSON文檔格式。廣泛使用SQL的開發人員可能需要適應和學習文檔建模方法。重新思考如何使用文檔在邏輯上構造數據,而不是將數據規范化為固定的數據庫模式,這是一個重要的方面。
7. 結論
本文旨在介紹存在的主要差異,以幫助讀者做出正確的決策并塑造信息系統(或簡單應用程序)的未來。
可以看到,SQL和NoSQL數據庫最終做的是幾乎相同的事情(存儲數據),但方式不同。數據庫管理系統(DBMS)的選擇對于任何數據項目來說都是一個重要的和結構化的時刻。當然,總是可以選擇一個選項,然后切換到另一個選項。但是在項目開始時進行一點概念分析和思考將節省時間和金錢。
今天的市場上到處都是NoSQL數據庫——每天都要面對兩三個這樣的數據庫,因為對于開發人員來說,轉到NoSQL有很多優勢。更靈活的數據模型和擺脫僵化模式是一個很大的優勢。還可以看到性能的顯著提高和水平伸縮。
圖源:unsplash
但大多數NoSQL產品仍處于產品周期的早期階段。在復雜連接之類的特性上,開發人員可能更喜歡使用傳統的RDBMS。對于某些項目,混合方法可能是最佳選擇。最后,根據項目的需求,每個公司都有自己的偏好。
因此,確定需求和數據庫,甚至使用混合方法,為項目的開發提供集成支持才是最合適的做法。