NoSQL簡史及定義
NoSQL
這個術語最早是在 1998 年被Carlo Strozzi
命名在他的輕量的,開源的關系型數據庫上的,但是該數據庫沒有提供標准的SQL
接口;
在2009 年再次被Eric Evans
提起,討論分布式開源數據庫的問題,這是的NoSQL
主要指的非關系型,分布式的,不提供關系型的atomicity(A)
,consistency(C)
,isolation(I)
,durability(D)
即ACID
的特性;
緊接着2009年在亞特蘭大舉行的no:sql討論會是一個里程碑,當時的口號是select fun, profit from real_world where relational=false,因此之后對於NoSQL
最普遍的解釋為非關系型的,強調Key-Value
和Document(文檔)
數據庫的優點,並非單純的反對關系型數據庫;
下面給NoSQL
下一個定義,如果你在網上查閱資料會得到很多種定義,大家的理解不盡相同,我這里引用 http://nosql-database.org/ 網站上的定義:下一代,主要解決以下幾點:非關系數據庫、分布式數據庫、開源數據庫和水平擴展數據庫
原文信息:Next Generation Databases mostly addressing some of the points: being non-relational, distributed, open-source and horizontally scalable
對於 NoSQL這個詞語,現在最普遍的理解就是:Not Only SQL
常見的NoSQl數據庫以及分類
NoSQL
僅僅是一個概念,還可以根據數據庫存儲數據的模型和特點分為以下種類
Key-Value
存儲,代表數據庫為Redis
,可以通過Key
快速的查找到對應的Value
值,非常適合存儲不涉及過多數據關系的業務數據,一般保存在內存中,可以有效的減少讀寫磁盤的IO
次數,提高了讀寫性能Documnet
文檔型 存儲,代表數據庫為MongoDB
, 文檔的內容一般使用類似JSON
的格式,存儲的內容就是文檔型的,由於文檔數據庫的no-schema的特性,可以存儲和讀取任意的數據,很好的解決的數據結構字段不確定的問題。對於文檔型的數據庫,一般是可以在某個字段上建立索引的等,文檔之間可以進行關聯,也就是說可以實現一些關系型數據庫的功能特性XML
存儲,代表數據庫為Berkeley DB XMl(BDB XML)
,是一個嵌入式數據庫,專門用於存儲和檢索XML格式的文檔,支持XQuery
這種查詢語言對XML
文檔進行高效的查詢Graph
圖存儲 代表數據庫為Neo4J
為最流行的圖數據庫,應用圖形理論(這里可以學習一下有關圖的數據結構)存儲實體之間的關系信息,最常見的應用就是保存社交網絡中人與人之間的關系比如微信好友之間的關系,還可以使用在推薦系統,如果我們將數據以圖的形式表現,那么將會非常有益於推薦規則的制定,這類數據庫可以很方便了解決了關系型數據庫存儲這類數據的缺點,查詢慢,設計復雜的問題Column
列存儲 代表數據庫為HBase
,傳統的關系型數據庫是按照行來存儲數據的,因此可以稱為“行數據庫”,而列數據庫是按照列來進行存儲數據的,使用列存儲可以的根據某一列數據類型特征選擇不同的算法來壓縮數據,提高存儲空間的利用率;當讀取多條數據的同一列的時候,讀取效率非常高,因為這些列的數據都放在一起存儲的;該類型的數據庫適合大量的數據存儲的應用場景不適合小量的數據存儲的應用場景,多用於大數據處理方面Object
對象存儲 代表數據庫db4o
該類型的數據庫用的不多,主要特點是:通過類似面向對象語言的語法操作數據庫,通過對象的方式存取數據
對於現在我們聽說的Elasticsearch
和NoSQL
的關系可以查這篇文章 https://www.elastic.co/cn/blog/found-elasticsearch-as-nosql ,可以把它歸類為文檔數據庫的一種
對於非常詳細的NoSQL
數據庫分類和NoSQL
列表的詳細信息(現已經超過255個了)可以查看這個網站 http://nosql-database.org/
關系型數據庫與NoSQL數據庫的區別
關系型數據庫特點
- 高度組織化,結構化數據
- 結構化查詢語言(SQL)
- 數據操作語言(DML),數據定義語言(DDL)
- 多表之間進行關聯查詢(
join
) - 嚴格的一致性(事務處理)
- ACID模型
對於關系型數據庫的事務ACID
特性,這里做一下解釋:
A(Atomicity)
: 原子性,原子的概念就是不可分隔,也就是說事務中的操作要么全部完成,要么都不做,事務成功的條件是事務中的所有操作都成功,只要事務中有一個操作失敗,真個事務就失敗,就行回滾C(Consistency)
: 一致性,指進行事務操作后,由原來的一致性狀態變成另一種一致性的狀態,也就是事務提交后,或者事務回滾后,數據庫的完整性一致性約束不能被破壞。任何數據寫入數據庫必須是有效的根據已定義的規則,包括約束,觸發器,任何組合,引用完整性保證主鍵,外鍵關系I(Isolation)
: 隔離性,事務之間不會相互影響,每個事務是彼此獨立的,也就是在一個事務提交之前對其他事務是不可見的D(Durability)
: 持久性,指一旦事務提交后,它所做的修改將會永久的保存在數據庫中,即使出現服務宕機也不會丟失
NoSQL數據庫特點
- 沒有固定的數據結構,鍵-值對存儲,列存儲,文檔存儲,圖形數據庫,可以靈活的進行擴展
- 沒有標准的查詢話語言,幾乎每一種
NoSQL
數據庫都會有自己獨特的查詢語言 - 最終一致性,非ACID
- CAP模型
- 高性能,可擴展,非常容易進行水平擴展
說明:這里CAP只是簡單提了一下,在下一篇會有文章專門來解釋CAP定理
NoSQL和SQL的區別
- 關系型數據庫基於
ACID
模型,NoSQL
非關系型基於CAP
模型 - 數據存儲結構:關系型數據庫一般都是固定的表結構,通過
DDL
語句來進行修改,不是很容易進行擴展;而NoSQL
非關系型存儲的機制就比較多了,就如上面所說的基於文檔的,基於鍵-指的等等,對數據的格式十分靈活沒有固定的表結構,方便進行擴展 - 數據的一致性:
NoSQL
非關系型數據庫強調最終一致性,沒有像關系型數據庫ACID
強調強一致性,從非關系型數據庫中讀到的有可能還是處於一個中間態的數據,因此如果你的業務對於數據的一致性要求很高,那么非關系型數據庫並不一個很好的選擇
思考:對於關系型數據庫
與NoSQL非關系型數據庫
你有什么樣不同的理解,歡迎留言討論。