關聯式資料庫(RDBMS)和NoSQL的比較

2021-09-23 22:33:37 字數 2955 閱讀 9648

現在主流的sql關聯式資料庫有:oracle、sql server mysql

nosql資料庫有bigtable、hbase、cassandra、******db、couchdb、mongodb和redis等。

sql月nosql的主要區別有:

關聯式資料庫用表來儲存資料,nosql資料庫則用json、鍵值對、文件等方式儲存資料,具體請看下圖(

看這個圖就可以知道,nosql擁有更加多樣化的儲存方式,並且使用類似json格式進行儲存可以更好地支援半結構化和非結構資料。

非結構化資料::行資料,即用二維表可以表達的資料,sql關聯式資料庫

半結構化資料:介於結構化資料和非結構化資料之間的資料。例如html、xml、樹、圖等,這類資料似有結構可循(用元素支撐其結構),但又不便於用二維表表達(元素間的巢狀往往比較複雜)。

可以說,nosql更方便儲存非結構化、半結構化的資料。

關聯式資料庫:一般是向上擴充套件。

nosql:便於水平擴充套件。

先來了解一下兩種擴充套件方式。(

向上擴充套件,買更好的伺服器,這種方式比較簡單,一般情況下向上擴充套件就可以解決問題,但是如果代價太大了(規格越高的硬體需要花費的錢越多),就不可取了。而且向上擴充套件總有極限的。

橫向擴充套件是通過副本(讀寫分離)、垂直切分,水平切分的方式,把不同的資料放在不同的節點(物理部署的mysql例項)中。

讀寫分離:給資料庫(主資料庫)增加乙個從資料庫,主資料庫負責文字的寫操作(增,刪,改),從資料庫負責資料讀的操作,如下圖所示。也可以一主多從(乙個主資料庫,多個從資料庫),不過需要進行負載均衡。                           

垂直切分:按照功能模組劃分資料,舉乙個例子:乙個電商**,資料庫中可能有庫存管理的資料,使用者管理的資料,訂單管理的資料,他們屬於不同的功能,可以將乙個資料庫分成三個資料庫,庫存管理的資料庫,使用者管理的資料庫,訂單管理的資料資料庫。

水平切分:將同乙個表中的資料進行分片儲存到不同的資料庫中。例如:乙個使用者表,我們可以將使用者分片儲存的不同的資料庫中,可以根據 使用者的id(userid),userid%3==0的使用者放到乙個庫中,userid%3==1 放到乙個庫中,userid%3==2放到乙個庫中,如下圖所示。

看了擴充套件方式的定義,我們可以思考為什麼rdbms難以橫向擴充套件。

rdbms的表與表之間維護著關係,一條查詢語句往往涉及到多個表,用多個條件進行連線。這時如果要進行橫向擴充套件(無論哪種方式都是要將資料分別放在多個資料庫,乃至多個伺服器上),在進行增刪改查的時候就很麻煩了,因為要在多台伺服器之間進行連線(join)操作。而nosql的儲存方式,實際上是通過將所有的屬性、字段、內容等儲存在乙個id下,這樣就避免了通過關係去維護多張表,即便是將資料放在多個伺服器上,也可以輕鬆實現對資料的crud操作。另外,rdbms的事務有acid四大特性,也阻礙了橫向擴充套件(至於為什麼目前我也不是很清楚,請大俠指點)。nosql犧牲了一致性,各個副本之間僅追求最終一致性,有利於分布式儲存。

擴充套件能力直接影響著分布式技術在資料庫中的應用:

資料庫所採用的分布式模型通常有分片和複製,複製又可以分為主從複製和對等複製。分片是將資料的各個部分存放在不同的伺服器中,以此實現橫向擴充套件。複製是將資料複製到多個節點。

主從複製模式下,有乙個「主節點」用來負責更新操作;其餘節點稱為「從節點」,用來負責讀資料;主從複製就是要讓從節點和主節點同步(將資料從主節點複製到從節點)。該模式下,可以通過增加更多的從節點來進行水平擴充套件,以增強對資料的讀取效能;當主節點出錯後,從節點依然可以處理讀取請求,增強了讀取操作的故障恢復能力;並且當主節點出錯後,可以很快指派乙個從節點為新的主節點,盡快恢復主節點的寫操作。但該模式適用於讀操作較為頻繁的情況,當寫操作非常頻繁時,頻繁地將資料複製到從節點的效果並不好。

對等複製模式下,資料被「平等地」複製到所有節點,且所有節點都可以進行讀寫。任一節點出錯時,只需要向其他節點繼續請求讀寫操作即可。不必擔心主從複製中主節點出錯而帶來的(即便是短暫的)失去寫資料的能力。但此模式的最大問題還是「寫入衝突」(兩個節點同時試圖更新同一條記錄)。

因為rdbms天然的資料結構,使得其難以橫向擴充套件。因此,rdbms也就難以支援分布式(分片和複製),而nosql對分布式具有天然的支援。

rdbms在存入資料之前要先定義好模式,比如你要儲存使用者的資訊,就要先定義好使用者表的各個欄位名(name,age,***...),這對於現在網路環境下的敏捷開發來說簡直是災難。因為每次想要在資料中加入新特性時,都意味著要更新表的字段。而nosql由於其使用類似json的資料結構來儲存資料,對動態模式就具體有天然的支援。

rdbms因為是在同一臺伺服器上進行讀寫操作,所以只需要通過事務去保證資料的一致性就會做的比較好。在乙個事務中,同一條sql查詢語句,多次讀取,所得資料沒有變化(沒有受到其他事務的干擾)。而對於分布式下的nosql資料庫來說就更加複雜一些。

更新一致性:a和b 同時修改不同節點上儲存的同一資料。a、b之間會有一人在更新完後查詢時發現自己剛剛更新的資料被另外乙個人的更新內容替代了。更新一致性可用樂觀鎖和悲觀鎖解決。悲觀鎖是不允許衝突發生,就是加入a和b同時修改同一資料時,只有乙個人能獲得鎖,當這個人修改完後,另乙個人根據這個人修改的結果,再去判斷自己是否要去修改。然而在高併發下,悲觀鎖容易引起死鎖(即a和b都占有著各自的資源,並同時去請求對方占有的資源),且悲觀鎖會大幅降低系統響應能力。樂觀鎖是先讓衝突發生,再去解決它。

讀取一致性:a和b同時讀取不同伺服器上的同一資料,而與此同時c修改了它。由於網路延時等原因,a和b讀到的內容可能發生不同。

在nosql中,為了引入分布式並顧及到效率,不得不放寬一致性約束,只保證最終一致性。最終一致性,即不保證在任意時刻任意節點上的同乙份資料都是相同的,但是隨著時間的遷移,不同節點上的同乙份資料總是在向趨同的方向變化。也可以簡單的理解為在一段時間後,節點間的資料會最終達到一致狀態。

nosql由於其資料儲存方式,帶來的優勢有:可擴充套件性更好,對分布式的支援更好,對動態模式的支援更好。帶來的問題是:不得不降低對資料一致性的要求,由強一致性轉為若一致性或最終一致性。

關聯式資料庫(RDBMS)小記

三個正規化 第一正規化 1nf 資料表中的每一列 每個字段 必須是不可拆分的最小單元,也就是確保每一列的原子性 這裡說的不可拆分通常是放在業務背景下而言的,是否可拆分視業務需求而定。如一張student表的adress表存省市縣時,如果業務需要針對更細粒度位址如市 縣做些crud操作則需要adres...

關聯式資料庫與非關聯式資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...

關聯式資料庫與非關聯式資料庫

關係型資料庫,是指採用了關係模型來組織資料的資料庫。關係模型是在1970年由ibm的研究員e.f.codd博士首先提出的,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流資料庫結構的主流模型。簡單來說,關係模型指的就是二維 模型,而乙個關係型資料庫就是由二維表及其之間的聯絡所組成的乙個...