關系型數據庫與非關系型數據庫
2019-07-02 16:34:48 by沖沖
1. 關系型數據庫
1.1 概念
關系型數據庫,是指采用了關系模型來組織數據的數據庫。關系模型指的就是二維表格模型,因此一個關系型數據庫就是由二維表及其之間的聯系所組成的一個數據組織。
目前十大主流的關系型數據庫:MySQL、Microsoft SQL Server、Oracle、SQLite、MariaDB(MySQL的分支)、PostgreSQL、Microsoft Access、Teradata、SAP。
1.2 結構
(1)關系:可以理解為一張二維表,每個關系都具有一個關系名,就是通常說的表名。
(2)元組:可以理解為二維表中的一行,在數據庫中經常被稱為記錄。
(3)屬性:可以理解為二維表中的一列,在數據庫中經常被稱為字段。
(4)域:屬性的取值范圍,也就是數據庫中某一列的取值限制。
(5)關鍵字:一組可以唯一標識元組的屬性,數據庫中常稱為主鍵,由一個或多個列組成。
(6)關系模式:指對關系的描述。其格式為:關系名(屬性1,屬性2, … … ,屬性N),在數據庫中成為表結構。
1.3 優點
① 容易理解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易理解。
② 使用方便:通用的SQL語言使得操作關系型數據庫非常方便。(SQL語言通用)
③ 易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗余和數據不一致的概率。(表結構易於維護)
1.4 瓶頸
① 高並發讀寫需求:網站的用戶並發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關系型數據庫來說,硬盤I/O是一個很大的瓶頸。
② 海量數據的高效率讀寫:網站每天產生的數據量是巨大的,對於關系型數據庫來說,在一張包含海量數據的表中查詢,效率是非常低的。
③ 高擴展性和可用性:在基於web的結構當中,數據庫是最難進行橫向擴展的,當一個應用系統的用戶量和訪問量與日俱增的時候,數據庫卻沒有辦法像web server和app server那樣簡單的通過添加更多的硬件和服務節點來擴展性能和負載能力。對於很多需要提供24小時不間斷服務的網站來說,對數據庫系統進行升級和擴展是非常痛苦的事情,往往需要停機維護和數據遷移。
1.5 非必要性功能
(1)對於網站來說,關系型數據庫的很多特性不再需要了:
① 事務一致性: 關系型數據庫在對事物一致性的維護中有很大的開銷,而現在很多web2.0系統對事物的讀寫一致性都不高。
② 讀寫實時性: 對關系數據庫來說,插入一條數據之后立刻查詢,是肯定可以讀出這條數據的,但是對於很多web應用來說,並不要求這么高的實時性,比如發一條消息之后,過幾秒乃至十幾秒之后才看到這條動態是完全可以接受的。
③ 復雜SQL,特別是多表關聯查詢: 任何大數據量的web系統,都非常忌諱多個大表的關聯查詢,以及復雜的數據分析類型的復雜SQL報表查詢,特別是SNS類型的網站(SNS,專指社交網絡服務,包括了社交軟件和社交網站),從需求以及產品階級角度,就避免了這種情況的產生。往往更多的只是單表的主鍵查詢,以及單表的簡單條件分頁查詢,SQL的功能極大的弱化了。
(2)在關系型數據庫中,導致性能欠佳的最主要原因是多表的關聯查詢,以及復雜的數據分析類型的復雜SQL報表查詢。為了保證數據庫的ACID特性,我們必須盡量按照其要求的范式進行設計,關系型數據庫中的表都是存儲一個格式化的數據結構。每個元組字段的組成都是一樣,即使不是每個元組都需要所有的字段,但數據庫會為每個元組分配所有的字段,這樣的結構可以便於標語表之間進行鏈接等操作,但從另一個角度來說它也是關系型數據庫性能瓶頸的一個因素。
注:數據庫事務必須具備ACID特性,ACID是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
2. 非關系型數據庫
2.1 概念
NoSQL最初指的是一個沒有SQL功能,輕量級的,開源的關系型數據庫。隨着時代需求的發展,我們要的不是“no sql”,而是“no relational”,也就是我們現在常說的非關系型數據庫。2009年明確NoSQL,用於指代那些非關系型的,分布式的,且一般不保證遵循ACID原則的數據存儲系統。非關系型數據庫的理念,例如,以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,這樣就不會局限於固定的結構,可以減少一些時間和空間的開銷。使用這種方式,用戶可以根據需要去添加自己需要的字段,這樣,為了獲取用戶的不同信息,不需要像關系型數據庫中,要對多表進行關聯查詢。僅需要根據key取出相應的value就可以完成查詢。但非關系型數據庫由於很少的約束,他也不能夠提供像SQL所提供的where這種對於字段屬性值情況的查詢。並且難以體現設計的完整性。他只適合存儲一些較為簡單的數據,對於需要進行較復雜查詢的數據,SQL數據庫顯的更為合適。
非關系型數據庫嚴格意義上,不是一種數據庫,而應該是一種數據結構化存儲方法的集合,可以是文檔或者鍵值對等。
2.2 分類
非關系型數據庫,都是針對某些特定的應用需求出現的,因此對於特定應用,專門的非關系型數據庫會具有極高的性能。依據結構化方法以及應用場合的不同,主要分為以下幾類:
(1)面向高性能並發讀寫的key-value數據庫:以鍵值對存儲數據的一種數據庫,類似Java
的map
,整個數據庫就像一個map
,每個鍵都會對應一個唯一的值。該數據庫的特點是,具有極高的並發讀寫性能。典型代表為Redis、Tokyo Cabinet、Flare、Amazon DynamoDB、Memcached、Microsoft Azure Cosmos DB、Hazelcast。
(2)面向海量數據訪問的面向文檔數據庫:該類數據庫的特點是,可以在海量的數據中快速的查詢數據。文檔存儲通常使用內部表示法,可以直接在應用程序中處理,主要是JSON,而
JSON
文檔也可以作為純文本存儲在鍵值存儲或關系數據庫系統中。典型代表為MongoDB、Amazon DynamoDB、Couchbase、Microsoft Azure Cosmos DB、CouchDB。
(3)面向可擴展性的分布式數據庫:普通的關系型數據庫都是以行為單位來存儲數據的,擅長以行為單位的讀入處理,比如特定條件數據的獲取。因此,關系型數據庫也被成為面向行的數據庫。相反,面向列的數據庫是以列為單位來存儲數據的,擅長以列為單位讀入數據。該類數據庫想解決的問題就是傳統數據庫存在可擴展性上的缺陷,該類數據庫可以適應數據量的增加以及數據結構的變化,將數據存儲在記錄中,能夠容納大量動態列。由於列名和記錄鍵不是固定的,並且由於記錄可能有數十億列,因此可擴展性存儲可以看作是二維鍵值存儲。典型代表為Cassandra、HBase、Microsoft Azure Cosmos DB、Datastax Enterprise、Accumulo。
(4)面向搜索數據內容的搜索引擎數據庫:專門用於搜索內容。主要是用於對海量數據進行接近實時的處理和分析處理,可用於機器學習和數據挖掘。典型代表為Elasticsearch、Splunk、Solr、MarkLogic、Sphinx。
2.3 優點
① 格式靈活:存儲數據的格式可以是key-value形式、文檔形式、圖片形式等等,使用靈活,應用場景廣泛,而關系型數據庫則只支持基礎類型。
② 速度快:NoSQL可以使用硬盤或者隨機存儲器作為載體,而關系型數據庫只能使用硬盤。
③ 高擴展性。
④ 成本低:NoSQL數據庫部署簡單,基本都是開源軟件。
2.4 缺陷
① 不支持SQL語句,學習和使用成本較高。
② 無事務處理。
③ 數據結構相對復雜,復雜查詢方面稍欠。
3. 關系型數據庫 PK 非關系型數據庫
① 關系型數據庫的最大特點就是事務的一致性:傳統的關系型數據庫讀寫操作都是事務的,具有ACID的特點,這個特性使得關系型數據庫可以用於幾乎所有對一致性有要求的系統中,如典型的銀行系統。但是,在網頁應用中,尤其是SNS應用中,一致性卻不是顯得那么重要,兩個人看到同一好友的數據更新的時間差那么幾秒是可以容忍的,因此,關系型數據庫的最大特點在這里已經無用武之地,起碼不是那么重要了。相反地,關系型數據庫為了維護一致性所付出的巨大代價就是其讀寫性能比較差,而像微博、facebook這類SNS的應用,對並發讀寫能力要求極高,關系型數據庫已經無法應付(在讀方面,傳統上為了克服關系型數據庫缺陷,提高性能,都是增加一級memcache來靜態化網頁,而在SNS中,變化太快,memchache已經無能為力了),因此,必須用新的一種數據結構存儲來代替關系數據庫。
② 關系數據庫的另一個特點就是其具有固定的表結構,因此,其擴展性極差,而在SNS中,系統的升級,功能的增加,往往意味着數據結構巨大變動,這一點關系型數據庫也難以應付,需要新的結構化數據存儲。因此,非關系型數據庫應運而生。由於不可能用一種數據結構化存儲應付所有的新的需求,所以,非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。
③ 必須強調的是,數據的持久存儲,尤其是海量數據的持久存儲,還是需要一種關系數據庫這員老將。
Oracle
那樣花費大量成本購買使用,相比關系型數據庫價格便宜。
② 查詢速度:NoSQL數據庫將數據存儲於緩存之中,而且不需要經過
SQL
層的解析,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及NoSQL數據庫。
③ 存儲數據的格式:NoSQL的存儲格式是
key-value
形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者集合等各種格式,而數據庫則只支持基礎類型。
④ 擴展性:關系型數據庫有類似join等多表查詢機制的限制,導致擴展很艱難。NoSQL基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
⑤ 持久存儲:NoSQL不使用於持久存儲,海量數據的持久存儲,還是需要關系型數據庫。
⑥ 數據一致性:非關系型數據庫一般強調的是數據最終一致性,不像關系型數據庫一樣強調數據的強一致性,從非關系型數據庫中讀到的有可能還是處於一個中間態的數據,NoSQL不提供對事務的處理。
4. CAP理論
CAP理論:一個分布式系統不可能同時滿足C(一致性)、A(可用性)、P(分區容錯性)三個基本需求,並且最多只能滿足其中的兩項。對於一個分布式系統來說,分區容錯是基本需求,否則不能稱之為分布式系統,因此需要在C和A之間尋求平衡。
C(Consistency)
一致性:一致性是指更新操作成功並返回客戶端完成后,所有節點在同一時間的數據完全一致。與ACID的C完全不同。
A(Availability)
可用性:可用性是指服務一直可用,而且是正常響應時間。
P(Partition tolerance)
分區容錯性:分區容錯性是指分布式系統在遇到某節點或網絡分區故障的時候,仍然能夠對外提供滿足一致性和可用性的服務。
5. 數據庫排名查詢
參考博客:
https://blog.csdn.net/m0_37947204/article/details/81047934
https://www.cnblogs.com/zylq-blog/p/7595979.html
https://www.jianshu.com/p/fd7b422d5f93