18 關係型資料和文件型資料庫有什麼區別?

2021-10-07 10:15:59 字數 3819 閱讀 9669

關聯式資料庫(relational database)是建立在關係模型基礎上的資料庫,借助於幾何代數等數學概念和方法來處理資料庫中的資料。所謂關係模型是一對

一、一對多或者多對多等關係,常見的關係型資料庫有 oracle、sql server、db2、mysql 等。

而文件型資料庫是一種非關係型資料庫,非關係型資料庫(not only sql,nosql)正好與關係型資料庫相反,它不是建立在「關係模型」上的資料庫。文件型資料庫的典型代表是 mongodb。

我們本課時的面試題是,關係型資料庫和文件型資料庫有什麼區別?

關係型資料庫屬於早期的傳統型資料庫,它有著標準化的資料模型,以及事務和持久化的支援、例如,關係型資料庫都會支援的acid 特性,也就是原子性(atomicity)、一致性(consistency)、隔離性(isolation)和永續性(durability),具體含義如下。

第一正規化(the first normal form,1nf):要求對屬性的原子性,也就是說要求資料庫中的字段需要具備原子性,不能再被拆分。

比如,使用者表中有字段:使用者 id、使用者名稱、**;而其中**又可以分為:家庭**和移動**等。因此,此表不符合第一正規化,如下圖所示:

第二正規化(the second normal form,2nf):例如訂單詳情表有這些字段:訂單 id、產品 id、產品名稱、產品單價、折扣。其中,訂單 id 和產品 id 為聯合主鍵,但這個表中的產品名稱和產品單價兩個欄位只依賴產品 id,和訂單 id 就沒有任何關係了,因此這個表也不符合第二正規化。

我們可以把原來的訂單表拆分為訂單表和產品表,其中訂單表包含:訂單 id、產品 id、折扣等字段;而產品表包含:產品 id、產品名稱、產品單價等字段。這樣就消除了產品名稱和產品單價多次重複出現的情況了,從而避免了冗餘資料的產生。.

第三正規化(the third normal form,3nf):想要滿足第三正規化必須先滿足第二正規化,第三正規化要求所有的非主鍵字段必須直接依賴主鍵,且不存在傳遞依賴的情況。

例如,有乙個學生表中包含了:學生 id、姓名、所在學院 id、學院**、學院位址等字段。這個表的所有字段(除去主鍵字段)都完全依賴唯一的主鍵字段(學生 id),所以符合第二正規化。但它存在乙個問題,學院**、學院位址依賴非主鍵字段學院 id,而不是直接依賴於主鍵,它是通過傳遞才依賴於主鍵,所以不符合第三正規化。

我們可以把學生表分為兩張表,一張是學生表包含了:學生 id、姓名、所在學院 id 等字段;另一張為學院表包含了:學院 id、學院**、學院位址等字段,這樣就滿足第三正規化的要求了。

可以看出,使用三正規化可以避免資料的冗餘,而且在更新表操作時,只需要更新單張表就可以了。

但隨著網際網路應用的快速發展,我們需要應對日益複雜且快速迭代的資料庫,以應對網際網路快速發展的趨勢,於是誕生了以 mongodb 為代表的文件型資料庫。它提供了更高效的讀/寫效能以及可自動容災的資料庫集群,還有靈活的資料庫結構,從而給系統的資料庫儲存帶來了更多可能 性。

當然 mongodb 的誕生並不是為了替代關係型資料庫,而是為系統的快速開發提供一種可能性,它和關係型資料庫是一種互補的關係,可供開發者在不同的業務場景下選擇相對應的資料庫型別。

本課時的面試題考察的是面試者對資料庫整體概念的理解與區分,這個問題看似簡單,但包含著眾多小的知識點,面試者需要真正的理解關係型資料庫和非關係型資料庫以及文件型資料庫之間的區別才能靈活應對。與之相關的面試題還有:

非關係型資料和文件型資料庫屬於包含關係,非關係型資料報含了文件型資料庫,文件型資料庫屬於非關係型資料。

非關係型資料通常包含 3 種資料庫型別:文件型資料庫、鍵值型資料庫和全文搜尋型資料庫,下面分別來看每種型別的具體用途。

文件型資料庫以 mongodb 和 apache couchdb 為代表,文件型資料庫通常以 json 或者 xml 為格式進行資料儲存。

以 mongodb 為例,它是由 c++ 編寫的一種面向文件的資料庫管理系統,在 2007 年 10 月 由 10gen 團隊所開發,並在 2009 年 2 月首度推出。mongodb 是以二進位制 json 格式儲存資料的,mongodb 對 json 做了一些優化,它支援了更多的資料型別,這種二進位制儲存的 json 我們也可以稱之為bson(binary json)

bson 具備三個特點:輕量、可遍歷以及高效,它的缺點是空間利用率不是很理想。mongodb 使用 bson 進行儲存的另乙個重要原因是 bson 具備可遍歷性。

mongodb 儲存結構示例如下:

其中,「_id」為 mongodb 預設的主鍵字段,它會為我們生成一起全域性唯一的 id 值,並且這個值在做資料分片時非常有用。

文件型資料庫的使用場景如下。

鍵值資料庫也就是key-value 資料庫,它的典型代表資料庫是redismemcached,而它們通常被當做非持久化的記憶體型資料庫快取來使用。當然 redis 資料庫是具備可持久化得能力的,但是開啟持久化會降低系統的執行效率,因此在使用時需要根據實際的情況,選擇開啟或者關閉持久化的功能。

鍵值型資料庫以極高的效能著稱,且除了 key-value 字串型別之外,還包含一些其他的資料型別。以 redis 為例,它提供了字串型別(string)、列表型別(list)、雜湊表型別(hash)、集合型別(set)、有序集合型別(zset)等五種最常用的基礎資料型別,還有管道型別(pipeline)、地理位置型別(geo)、基數統計型別(hyperloglog)和流型別(stream),並且還提供了訊息佇列的功能。

此資料庫的優點是效能比較高,缺點是對事務的支援不是很好。

傳統的關係型資料庫主要是依賴索引來實現快速查詢功能的,而在全文搜尋的業務下,索引很難滿足查詢的需求。因為全文搜尋需要支援模糊匹配的,當資料量比較大的情況下,傳遞的關係型資料庫的查詢效率是非常低的;另乙個原因是全文搜尋需要支援多條件隨意組合排序,如果要通過索引來實現的話,則需要建立大量的索引,而傳統型資料庫也很難實現,因此需要專門全文搜尋引擎和相關的資料庫才能實現此功能。

全文搜尋型資料庫以 elasticsearch 和 solr 為代表,它們的出現解決了關係型資料庫全文搜尋功能較弱的問題。

mongodb 在 4.0 之前是不支援事務的,不支援的原因也很簡單,因為文件型資料庫和傳統的關係型資料庫不一樣,不需要滿足三正規化。文件型資料庫之所以效能比較高的另乙個主要原因,就是使用文件型資料庫不用進行多表關聯性查詢,因為文件型資料庫會把相關的資訊存放到一張表中。因此,無需關聯多表查詢的 mongodb,在這種情況下的查詢效能是比較高的。

把所有相關的資料都放入乙個表中,這也是 mongodb 之前很長一段時間內不支援事務的原因,它可以保證單錶操作的原子性,一條記錄要麼成功插入,要麼插入失敗,不會存在插入了一半的資料。因此,在這種設計思路下,mongodb 官方認為「事務功能」的實現沒有那麼緊迫。

但在 mongodb 4.0 之中正式新增了事務的功能,並且在 mongodb 4.2 中實現了分布式事務的功能,至此 mongodb 開啟了支援事務之旅。

本課時我們首先講了關係型資料庫的 acid 特性以及設計時需要遵循的三正規化設計思想;然後介紹了以 mongodb 為代表的文件型資料庫與關係型資料庫的不同;最後還講了 mongodb 的事務功能,以及文件性資料庫與非關係型資料庫的關係,希望本課時的內容對你有幫助。

關係型資料庫 非關係型資料庫

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

關係型資料庫 非關係型資料庫

2019 02 25 20 38 36 關係型資料庫和非關係型資料的比較 一 關係型資料庫 關係型資料庫最典型的資料結構是表,由二維表及其之間的聯絡所組成的乙個資料組織 優點 1 易於維護 都是使用表結構,格式一致 2 使用方便 sql語言通用,可用於複雜查詢 3 複雜操作 支援sql,可用於乙個表...

關係型資料庫與非關係型資料庫

關係型資料庫與非關係型資料庫的區別 非關係型資料庫的優勢 1.效能 nosql是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過sql層的解析,所以效能非常高。2.可擴充套件性 同樣也是因為基於鍵值對,資料之間沒有耦合性,所以非常容易水平擴充套件。關係型資料庫的優勢 1.複雜查詢 可...