天天看點

關系型資料庫和非關系型資料庫關系型資料庫和非關系型資料庫

關系型資料庫和非關系型資料庫

1、什麼是資料庫

  • 資料庫是資料的倉庫。
  • 與普通的“資料倉庫”不同的是,資料庫依據“資料結構”來組織資料,因為“資料結構”,是以我們看到的資料是比較“條理化”的(比如不會跟以前的普通檔案存儲式存儲成一個檔案那麼不條理化,我們的資料庫分成一個個庫,分成一個個表,分成一條條記錄,這些記錄是多麼分明)
  • 也因為其“資料結構”式,是以有極高的查找速率(比如B-Tree查找法),(由于專精,可以根據自己的結構特性來快速查找,是以對于資料庫的查找會比較快捷;不像普通檔案系統的“查找”那麼通用)
  • 如果與EXCEL來比的話,能明顯的看出資料庫的好處,我們能給一個個“字段”添加“限制”(比如限制一列的值不能為空)
  • 資料庫與普通的檔案系統的主要差別(起因):資料庫能快速查找對應的資料
  • 常說的XX資料庫,其實實質上是XX資料庫管理系統。資料庫管理系統是一個軟體,是資料庫管理的程式實作

2、什麼是關系型資料庫

  • 關系型資料庫是依據關系模型來建立的資料庫。
  • 簡單來說,關系型資料庫是由多張能互相聯接的二維行清單格組成的資料庫。
  • 所謂關系模型就是“一對一、一對多、多對多”等關系模型,關系模型就是指二維表格模型,因而一個關系型資料庫就是由二維表及其之間的聯系組成的一個資料組織。
  • 關系型資料可以很好地存儲一些關系模型的資料,比如一個老師對應多個學生的資料(“多對多”),一本書對應多個作者(“一對多”),一本書對應一個出版日期(“一對一”)
  • 關系模型就是指二維表格模型,因而一個關系型資料庫就是由二維表及其之間的聯系組成的一個資料組織
  • 關系模型包括資料結構(資料存儲的問題,二維表)、操作指令集合(SQL語句)、完整性限制(表内資料限制、表與表之間的限制)。
  • 建立在關系模型基礎上的資料庫,借助于集合代數等數學概念和方法來處理資料庫中的資料。

    簡單說來就是關系型資料庫用了選擇、投影、連接配接、并、交、差、除、增删查改等數學方法來實作對資料的存儲和查詢。可以用SQL語句友善的在一個表及其多個表之間做非常複雜的資料查詢。安全性高。

  • 2.2 常見的關系型資料庫

    Oracle、DB2、PostgreSQL、Microsoft SQL Server、Microsoft Access、MySQL

    2.3特點

    安全(因為存儲在磁盤中,不會說突然斷電資料就沒有了)、

    容易了解(建立在關系模型上)、

    但不節省空間(因為建立在關系模型上,就要遵循某些規則,好比資料中某字段值即使為空仍要配置設定空間)

3、什麼是非關系型資料庫

  • 非關系型資料庫主要是基于“非關系模型”的資料庫(由于關系型太大,是以一般用“非關系型”來表示其他類型的資料庫)
  • NoSQL的四大分類為:鍵值存儲資料庫、列存儲資料庫、文檔型資料庫(MongoDB屬于該類)、圖形資料庫。
  • NoSQL,指非關系型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同于傳統的關系型資料庫(RDBMS)的資料庫管理系統的統稱
  • 資料庫在資料關聯之間更為自由,限制條件更少,(甚至沒有),但是這并不能阻擋它的發展,以“鍵值對”為基礎的NoSql在性能上可以說是碾壓對手,大家都知道NoSql不需要經過Sql層的解析的,相比關系型資料庫資料之間的高耦合性,這讓它具有更高的平行擴充性
  • 簡稱NOSQL,是基于鍵值對的對應關系,并且不需要經過SQL層的解析,是以性能非常高。但是不适合用在多表聯合查詢和一些較複雜的查詢中。NoSQL用于超大規模資料的存儲
  • SQL(Structured Query Language)語言是1974年由Boyce和Chamberlin提出的一種介于關系代數與關系演算之間的結構化查詢語言,是一個通用的、功能極強的關系型資料庫語言。
  • 表是以行和列的形式組織起來的資料的集合。一個資料庫包括一個或多個表。例如,可能有一個有關作者資訊的名為 authors 的表。每列都包含特定類型的,如作者的姓氏。每行都包含有關特定作者的所有資訊:姓名、住址等等。在關系型資料庫當中一個表就是一個關系,一個關系資料庫可以包含多個表。
  • 非關系型模型比如有:
    • 列模型:存儲的資料是一列列的。關系型資料庫以一行作為一個記錄,列模型資料庫以一列為一個記錄。(這種模型,資料即索引,IO很快,主要是一些分布式資料庫)
    • 鍵值對模型:存儲的資料是一個個“鍵值對”,比如name:liming,那麼name這個鍵裡面存的值就是liming
    • 文檔類模型:以一個個文檔來存儲資料,有點類似“鍵值對”

3.2常見的非關系型資料庫

  • 列模型:Hbase
  • 鍵值對模型:redis,MemcacheDB
  • 文檔類模型:mongoDB

3.3 特點

效率高(因為存儲在記憶體 中)但不安全(斷電丢失資料,但其中redis可以同步資料到磁盤中),現在很多非關系型資料庫都開始支援轉存到磁盤中。

3.4常見的四類非關系型資料庫

NoSQL描述的是大量結構化資料存儲方法的集合,根據結構化方法以及應用場合的不同,主要可以将NoSQL分為以下幾類。

(1)Column-Oriented

面向檢索的列式存儲,其存儲結構為列式結構,同于關系型資料庫的行式結構,這種結構會讓很多統計聚合操作更簡單友善,使系統具有較高的可擴充性。這類資料庫還可以适應海量資料的增加以及資料結構的變化,這個特點與雲計算所需的相關需求是相符合的,比如GoogleAppengine的BigTable以及相同設計理念的Hadoop子系統HaBase就是這類的典型代表。需要特别指出的是,Big Table特别适用于MapReduce處理,這對于雲計算的發展有很高的适應性。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-pHf5KzSS-1580088711258)(關系型資料庫和非關系型資料庫\3.png)]

(2)Key-Value。

面向高性能并發讀/寫的緩存存儲,其結構類似于資料結構中的Hash表,每個Key分别對應一個Value,能夠提供非常快的查詢速度、大資料存放量和高并發操作,非常适合通過主鍵對資料進行查詢和修改等操作。Key-Value資料庫的主要特點是具有極高的并發讀/寫性能,非常适合作為緩存系統使用。MemcacheDB、BerkeleyDB、Redis、Flare就是Key-Value資料庫的代表。

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-gC1Owccr-1580088711260)(關系型資料庫和非關系型資料庫\2.png)]

(3)Document-Oriented。

面向海量資料通路的文檔存儲,這類存儲的結構與Key-Value非常相似,也是每個Key分别對應一個Value,但是這個Value主要以JSON(JavaScriptObjectNotations)或者XML等格式的文檔來進行存儲。這種存儲方式可以很友善地被面向對象的語言所使用。這類資料庫可在海量的資料中快速查詢資料,典型代表為MongoDB、CouchDB等。

NoSQL具有擴充簡單、高并發、高穩定性、成本低廉等優勢,也存在一些問題。例如,NoSQL暫不提供SQL的支援,會造成開發人員的額外學習成本;NoSQL大多為開源軟體其成熟度與商用的關系型資料庫系統相比有差距;NoSQL的架構特性決定了其很難保證資料的完整性,适合在一些特殊的應用場景使用

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-YVTHOb5d-1580088711261)(關系型資料庫和非關系型資料庫\1.png)]

(4)picture

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-wJlfZCEg-1580088711263)(關系型資料庫和非關系型資料庫\4.png)]

4、關系型資料庫和非關系型資料庫比較

非關系型資料庫優點:

1)成本:nosql資料庫簡單易部署,基本都是開源軟體,不需要像使用oracle那樣花費大量成本購買使用,相比關系型資料庫價格便宜。

2)查詢速度:nosql資料庫将資料存儲于緩存之中,關系型資料庫将資料存儲在硬碟中,自然查詢速度遠不及nosql資料庫。

3)存儲資料的格式:nosql的存儲格式是key,value形式、文檔形式、圖檔形式等等,是以可以存儲基礎類型以及對象或者是集合等各種格式,而資料庫則隻支援基礎類型(varchar等)。

4)擴充性:關系型資料庫有類似join這樣的多表查詢機制的限制導緻擴充很艱難。

5)、性能NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,是以性能非常高。

6)、可擴充性同樣也是因為基于鍵值對,資料之間沒有耦合性,是以非常容易水準擴充。

非關系型資料庫缺點:

1)維護的工具和資料有限,因為nosql是屬于新的技術,不能和關系型資料庫10幾年的技術同日而語。

2)不提供對sql的支援,如果不支援sql這樣的工業标準,将産生一定使用者的學習和使用成本。

3)不提供關系型資料庫對事務的處理

4)隻适合存儲一些較為簡單的資料,對于需要進行較複雜查詢的資料,關系型資料庫顯的更為合适。不适合持久存儲海量資料

5)、資料結構相對複雜,複雜查詢方面稍欠

關系型資料庫的優勢

1、複雜查詢可以用SQL語句友善的在一個表以及多個表之間做非常複雜的資料查詢。

2、事務支援使得對于安全性能很高的資料通路要求得以實作。這兩類資料庫,對方的優勢就是自己的弱勢,反之亦然。

3、容易了解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易了解

4、使用友善:通用的SQL語言使得操作關系型資料庫非常友善

5、易于維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料備援和資料不一緻的機率

6、易于維護:都是使用表結構,格式一緻;

7、使用友善:SQL語言通用,可用于複雜查詢;

8、複雜操作:支援SQL,可用于一個表以及多個表之間非常複雜的查詢。

關系型資料庫的缺點

1、讀寫性能比較差,尤其是海量資料的高效率讀寫;

2、固定的表結構,靈活度稍欠;

3、高并發讀寫需求,傳統關系型資料庫來說,硬碟I/O是一個很大的瓶頸。

兩者的不同

NoSQL與關系型資料庫存在許多顯著的不同點,其中最重要的是:

1、NoSQL不使用SQL作為查詢語言。其資料存儲可以不需要固定的表格模式

2、會避免使用SQL的JOIN操作,一般有水準可擴充性的特征1、資料存儲方式不同。

3、關系型和非關系型資料庫的主要差異是資料存儲的方式。關系型資料天然就是表格式的,是以存儲在資料表的行和列中。資料表可以彼此關聯協作存儲,也很容易提取資料。

與其相反,非關系型資料不适合存儲在資料表的行和列中,而是大塊組合在一起。非關系型資料通常存儲在資料集中,就像文檔、鍵值對或者圖結構。你的資料及其特性是選擇資料存儲和提取方式的首要影響因素。

4、擴充方式不同。SQL和NoSQL資料庫最大的差别可能是在擴充方式上,要支援日益增長的需求當然要擴充。要支援更多并發量,SQL資料庫是縱向擴充,也就是說提高處理能力,使用速度更快速的計算機,這樣處理相同的資料集就更快了。因為資料存儲在關系表中,操作的性能瓶頸可能涉及很多個表,這都需要通過提高計算機性能來克服。雖然SQL資料庫有很大擴充空間,但最終肯定會達到縱向擴充的上限。而NoSQL資料庫是橫向擴充的。而非關系型資料存儲天然就是分布式的,NoSQL資料庫的擴充可以通過給資源池添加更多普通的資料庫伺服器(節點)來分擔負載。3、對事務性的支援不同。

5、如果資料操作需要高事務性或者複雜資料查詢需要控制執行計劃,那麼傳統的SQL資料庫從性能和穩定性方面考慮是你的最佳選擇。SQL資料庫支援對事務原子性細粒度控制,并且易于復原事務。雖然NoSQL資料庫也可以使用事務操作,但穩定性方面沒法和關系型資料庫比較,是以它們真正閃亮的價值是在操作的擴充性和大資料量處理方面。

6、成本:

Nosql

資料庫簡單易部署,基本都是開源軟體,不需要像使用

Oracle

那樣花費大量成本購買使用,相比關系型資料庫價格便宜。

7、查詢速度:

Nosql

資料庫将資料存儲于緩存之中,而且不需要經過

SQL

層的解析,關系型資料庫将資料存儲在硬碟中,自然查詢速度遠不及

Nosql

資料庫。

8、存儲資料的格式:

Nosql

的存儲格式是

key,value

形式、文檔形式、圖檔形式等等,是以可以存儲基礎類型以及對象或者是集合等各種格式,而資料庫則隻支援基礎類型。

9、擴充性:關系型資料庫有類似join這樣的多表查詢機制的限制導緻擴充很艱難。

Nosql

基于鍵值對,資料之間沒有耦合性,是以非常容易水準擴充。

10、持久存儲:

Nosql

不使用于持久存儲,海量資料的持久存儲,還是需要關系型資料庫

11、資料一緻性:非關系型資料庫一般強調的是資料最終一緻性,不像關系型資料庫一樣強調資料的強一緻性,從非關系型資料庫中讀到的有可能還是處于一個中間态的資料,

Nosql

不提供對事務的處理。

資料庫 類型 特性 優點 缺點
關系型資料庫 SQLite、Oracle、mysql 1、關系型資料庫,是指采用了關系模型來組織 資料的資料庫; 2、關系型資料庫的最大特點就是事務的一緻性; 3、簡單來說,關系模型指的就是二維表格模型, 而一個關系型資料庫就是由二維表及其之間的聯系所組成的一個資料組織。 1、容易了解:二維表結構是非常貼近邏輯世界一個概念,關系模型相對網狀、層次等其他模型來說更容易了解; 2、使用友善:通用的SQL語言使得操作關系型資料庫非常友善; 3、易于維護:豐富的完整性(實體完整性、參照完整性和使用者定義的完整性)大大減低了資料備援和資料不一緻的機率; 4、支援SQL,可用于複雜的查詢。 1、為了維護一緻性所付出的巨大代價就是其讀寫性能比較差; 2、固定的表結構; 3、高并發讀寫需求; 4、海量資料的高效率讀寫;
非關系型資料庫 MongoDb、redis、HBase 1、使用鍵值對存儲資料; 2、分布式; 3、一般不支援ACID特性; 4、非關系型資料庫嚴格上不是一種資料庫,應該是一種資料結構化存儲方法的集合。 1、無需經過sql層的解析,讀寫性能很高; 2、基于鍵值對,資料沒有耦合性,容易擴充; 3、存儲資料的格式:nosql的存儲格式是key,value形式、文檔形式、圖檔形式等等,文檔形式、圖檔形式等等,而關系型資料庫則隻支援基礎類型。 1、不提供sql支援,學習和使用成本較高; 2、無事務處理,附加功能bi和報表等支援也不好;

5、舉例

1.關系型資料庫通過外鍵關聯來建立表與表之間的關系,

2.非關系型資料庫通常指資料以對象的形式存儲在資料庫中,而對象之間的關系通過每個對象自身的屬性來決定

比如 有一個學生的資料:

​ 姓名:張三,性别:男,學号:12345,班級:二年級一班

還有一個班級的資料:

​ 班級:二年級一班,班主任:李四

關系型資料庫中,我們建立學生表和班級表來存這兩條資料,并且學生表中的班級存儲的是班級表中的主鍵。

非關系型資料庫中,我們建立兩個對象,一個是學生對象,一個是班級對象,用代碼表示如下:

class Student {
    String id;
    String name;
    String sex;
    String number;
    String classid;
}
class Grade {
    String id;
    String name;
    String teacher;
}
           

通過設定Student類的classid等于Grade類的id來建立這種關系

非關系型資料庫中,我們查詢一條資料,結果出來一個數組,關系型資料庫中,查詢一條資料結果是一個對象。

注1:資料庫事務必須具備ACID特性,ACID是Atomic原子性,Consistency一緻性,Isolation隔離性,Durability持久性。

6、問題答疑

  • 問:為什麼 MySQL 資料庫無法承受巨大的通路量,而 Redis Memcached 卻可以?

因為 MySQL 使用檔案去存儲資料,這就意味着它的查詢和寫入速度受限于硬碟的速度。雖然 MySQL 也使用了記憶體緩存一部分資料,但這隻能減少一部分的查詢請求,如果查詢請求數變多,同樣會到達硬碟的 IO 瓶頸。

另一方面,關系型資料庫為了實作資料的強一緻性,在每次寫入資料的時候會對相關的資料進行加鎖操作,這樣就導緻在某個時刻,相關的資料隻能有一個線程在操作,這樣也從某種程度上限制了 MySQL 的讀寫性能。

如果此時查詢緩存并沒有相關資料,那麼還會有一部分 IO 等待的事件,進而導緻加鎖時間變長。

而 Redis、Memcached 之是以能夠承受得住 MySQL 無法承受的海量查詢,很大程度上是因為他們将所有資料都存在了記憶體中,是以它們并不需要進行 IO 等待,直接可以從記憶體中查詢資料并傳回。

而記憶體的讀取效率則是硬碟的 40 倍左右,存儲媒體的巨大差別導緻了他們的應用特性。

  • 問:那 MongoDb 與 Redis 相比有什麼優勢可言,它更适用于什麼場景呢?

答:MongoDb 的出現與 Redis 的出現類似,都是用來解決 MySQL 無法實作海量通路而存在的。但 Redis 僅僅是一個 key-value 的緩存系統,其幾乎沒有任何資料庫特性,在那些許多進行查詢的場景中,redis 無法勝任。

在這個時候 MongoDb 憑借其出色和豐富的查詢功能脫穎而出。

另外 MongoDb 也能存儲比 MySQL 更加大量的資料。MongoDb 适合那種資料結構經常變化,資料之間沒有聯系,這種場景适合用 MongoDb,例如多重嵌套的留言回複

7、參考網址

https://www.cnblogs.com/clsn/p/8214194.html