SQL和NoSQL
數據庫可以分為關系型數據庫
和非關系型數據庫
,SQL(Structured Query Language)
相信大家并不陌生,這是用于操作關系型數據庫
的語言,而NoSQL
,顧名思義,它對應的就是非關系數據庫
,它是操作非關系型數據庫的技術類別。二者有很多地方是相同的,因為它們都是操作數據庫的技術,但二者又有很多的不同之處,下面讓我們從不同的角度了解二者的差異。
結構化(Structure)
SQL
是結構化的查詢語言,其結構化表現在數據是以一張二維表的形式保存在數據庫中的,并且在創建表的時候,可以給表添加約束和字段限制。這些約束一旦建立好了,則這張二維表的結構就確定了,之后插入表中的數據就需要嚴格按照表的結構進行插入。并且表的結構是不建議修改的,需要在項目初期就確定好整張表的結構——由此也可以看出結構化對于SQL
的重要性。
而NoSQL
則是非結構化的
,其對于數據的結構并沒有嚴格的約束——但并不是意味著完全沒有約束,需要根據NoSQL
數據庫的類型具體分析。但不論是哪種,相較于SQL
的數據結構都比較松散,并沒有這么強的結構和約束。
關系型
SQL
對應的是關系型數據庫
,表中的數據是有關聯的。比如有三張表tb_user(用戶表)
、tb_item(商品表)
、tb_order(訂單表)
,這三張表看似是沒有任何關系的,但是可以通過foreign key
外鍵技術讓三張表產生關系:
在刪除數據的時候,必須按照外鍵的關系按照順序刪除。
而NoSQL
數據庫本身是不會維護這種表之間的關系的,如果想要有SQL
數據庫一樣的關系們必須依靠程序員自己維護。
SQL查詢
關系型數據庫
可以通過SQL語句
完成查詢,并且SQL語句
在關系型數據庫中是通用的,不論是MySQL
或者Oracle
或者SQLSever
,SQL語句
都是通用的,其格式是固定的,語法也是固定的。
而非關系型數據庫
中的查詢語句完全不固定,根據不同的非關系型數據庫
,有不同的查詢語句。
上圖是三種常見非關系型數據庫
的查詢語句,如圖所示,三者都實現了查詢id為1的用戶信息
這個功能,但是查詢的語句卻是大相徑庭的:Redis
是一種命令、MongoDB
是一種基于函數形式的調用、elasticsearch
是一種基于RESTful風格的請求
。
事務
確保事務
可靠執行的四個特性是ACID(Atomicity原子性、Consistency一致性、Isolation隔離性、Durability持久性)
,在關系型數據庫
中,經常會使用到事務,特別是涉及到多表操作時,而數據庫底層可以幫助我們實現ACID
的特性,所以說可以認為所有的關系型數據庫都是滿足ACID特性
的。
而非關系型數據庫
對于事務的ACID特性
支持并不完善,有的數據庫無法滿足事務的強一致性,只能滿足基本一致性,有的數據庫甚至不支持事務。
存儲方式
關系型數據庫
數據庫中的數據存儲一般是在磁盤中,而非關系型數據庫
數據庫中的數據一般是存儲在內存中。通過一些計算機組成原理的知識,我們可以知道內存的讀寫速度是遠遠高于磁盤的,所以說一般基于內存存儲的非關系型數據庫
的查詢速度會遠遠高于基于磁盤存儲的關系型數據庫
。但由于內存的容量較小,非關系型數據庫
的數據容量也會小于關系型數據庫
,并且內存資源十分的寶貴,所以說一般不用來作持久化存儲。
總結
上表就是SQL
和NoSQL
的主要區別,在實際開發中可以按照具體的使用場景來選擇具體需要使用的數據庫,但是在更多的情況下,會將二者結合起來使用,通過SQL
的結構化存儲來持久化保存數據;然后通過NoSQL
的極致性能來做數據緩存,提升查詢效率。