關係型數據庫和非關係型數據庫有什麼區別?

池璐


先說說關係型數據庫和非關係型數據庫有什麼區別

這裡的關係型和非關係型,主要是數據存儲格式的區別,我們常見的關係型數據庫有Mysql、Oracle、DB2、SQL Server等,都是通過關係模型來組織數據,也就是二維表格模型。

而非關係型數據庫,就不是按照這個二維表格來存儲數據了,例如Redis是使用鍵值對(key-value)來組織數據,MongoDB是採用BSON的格式(可以想象成JSON);並且不侷限於固定的結構。

關係型數據庫和非關係型數據庫之間的關係,也不是有你沒有,二者選其一,通常都是配合起來使用的。

各自的優缺點

  • 關係型數據庫,容易理解,使用方便(通過SQL語言操作),易於維護;但是因為數據在磁盤上存儲,I/O會成為一個很大的瓶頸,如果在高併發的場景下,性能降低的很快;另外,對於關係型數據庫,當單表數據量增加到一定程度的時候,表的操作效率也會很低;表結構固定,當數據量比較大的時候,對錶結構的擴展會是災難性的。

  • 非慣性數據庫因為數據結構的“隨性”,用戶可以根據需要增加字段,關係型數據習慣設計成多張表,然後通過表關聯查詢,而非關係型數據庫(文檔性)會把所有字段放到一個集合中,避免多表的關聯。不過缺點也非常明顯,“隨性”也就意味著沒有標準,單集合有好處也有壞處,沒有完整性約束,對於複雜的業務場景支持比較差。

至於MongoDB和Redis怎麼選擇,兩者差別還是很大的,適用場景也不同

  • Redis的數據存儲格式是key-value,支持持久化、 支持事務,經常用於緩存、高併發下的讀寫(計數器、最新列表、秒殺),因為單線程的機制也會用於分佈式鎖。

  • MongoDB的數據存儲格式為BSON(類似於JSON),支持快速讀寫,特別是大吞吐量的寫操作;如果表結構不明確,未來可能會發生很大的變化,非常適合使用MongoDB。

  • 架構中可以同時包含關係型數據庫、Redis和MongoDB,各司其職。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


會點代碼的大叔


相信不少人在工作中都遇到過以下對話:

程序員A:又要到流量高峰期了,感覺數據庫要崩。

程序員B:嗯嗯,趕緊擴容吧。

雖然數據庫很耳熟,但是它究竟是何方神聖呢?今天就給大家科普一下。

數據庫,其實就是互聯網業務存儲、查詢數據的倉庫。通過幾十年的發展歷史讓數據庫衍生出了各種不同的類型。

1、關係型數據庫

關係型數據庫,是指採用了關係模型來組織數據的數據庫。例如,某個學生的信息——姓名:張三,性別:男,學號:12345,班級:二年級一班,每一個信息之間是有聯繫的,而數據也是以表格形式存儲的。

這就是最早的數據庫形態,1970年IBM的研究員E.F.Codd博士首先提出關係模型,在之後的幾十年中,關係模型的概念得到了充分的發展並逐漸成為主流數據庫結構的主流模型。Oracle、DB2、Microsoft SQL Server、MySQL等都屬於這一範疇。

但是,這類數據庫的特點是一致性強,缺點是讀寫性能差。

2、非關係型數據庫(NoSQL)

顧名思義,非關係型數據庫是相對關係型數據庫的一個概念,起初指的是“沒有SQL”的數據庫,但現在已經公認為“no relational”(非關係型)。非關係型數據庫是根據特定的應用場景設計出來的,沒有明確的分類標準,但根據應用場景大致可分為幾類:1、文檔數據庫,沒研究過定義,通常mongodb 就是文檔數據庫,特點就是數據定義比較靈活。2、Kv數據庫,提供的是kv的數據表示模式。單機的rocksdb,分佈式的tikv之類。3、圖數據庫。數據可以用圖來定義。4、列式數據庫。hbase之類,這裡可能有爭議,很多人把hbase 定義為列存。

非關係型數據庫的代表是MongoDB、Redis以及Hbase,其特點與關係型數據庫相反。


3、雲原生數據庫

之前提到的數據庫都屬於傳統數據庫和開源數據庫,但到了雲計算時代,無論是雲服務提供商還是用戶,都需要一個完全為雲打造的數據庫,於是誕生了全新的產品形態——雲原生數據庫。

作為雲計算領域的先行者,亞馬遜在2014年11月召開的AWS re:Invent 年度大會上,發佈了雲原生數據庫Aurora, 讓數據庫行業發生了翻天覆地的變化。

在亞馬遜之後,許多雲廠商也紛紛投入雲原生數據庫研究。比如2017年9月,阿里雲在國內率先發布自研的雲原生數據庫POLARDB,它採用了自主研發分佈式存儲引擎,計算服務器和存儲數據分離的架構。

如今,國際社會公認,與傳統商業數據庫相比,雲原生數據庫擁有以下幾個大優勢,是未來的大勢所趨。


1)價格更低

傳統商業數據庫按年、按CPU這樣的方式進行售賣,對大體量的企業而言,每年需要數百萬甚至千萬的費用。

雲原生數據庫按使用量付費,讓用戶可以以非常低的價格就享受到企業級數據庫的服務。用戶可以根據自己的業務實際發展情況,按需的購買,可以大大降低企業在早期發展過程的成本。

此外,雲原生數據庫天然是規模化的,規模化會帶來成本的下降。這也大大降低單個用戶的成本。例如,阿里雲PolarDB價格僅為商業數據庫的1/10。

2)更強的性能

用戶使用傳統的數據庫需要單獨購買硬件,然而傳統的數據庫廠商則更傾向於去適配通用的硬件,對於一些特定的、前沿的硬件,不會去專門適配,所以傳統數據庫用戶無法享受新硬件的紅利。

而云原生數據庫的架構可以重複享受硬件變革帶來的紅利,從而實現更強的性能。

3)更快速的迭代,讓數據庫更安全穩定

雲原生數據庫可以做到以周,甚至以天為單位來迭代數據庫,這是傳統的數據庫不可能做到的。當系統出現問題時,雲原生數據庫可以快速進行升級,而傳統數據庫升級的週期通常是年,級別是出現了非常嚴重的漏洞,升級的週期也是以月為單位來計算的。

4)無需關注部署、運維等,全力專注業務開發

現在是一個快速創新的時代,每家企業都希望將重要的資源聚焦在自己的核心業務開發上。使用雲原生數據庫,讓企業不再需要關注數據庫的部署與運維,開箱即用,全力專注在自己的業務開發和用戶價值上。

對於關係型數據庫和非關係型數據庫的區別就先介紹這麼多,如果還有更多想知道的,歡迎留言提問。覺得雲原生數據庫不錯的,也可以試用一下,也許你會愛上它。


阿里雲


相信大家在二級數據庫考試的時候都做過這麼一道題,關係型數據庫中的關係是什麼意思?答案是:數據模型符合滿足一定條件的二維表格式,即是這張二維表中的行都是一個個元素,而列是一個個的屬性,這種結構化的數據通過結構化的查詢語言(SQL)可以以不同的方式進行存取!


所以說,SQL的定義和執行就代表著關係型數據庫結構的數據存取,從where,groupby,order等命令,sum,count等函數就能一目瞭然的知道,關係型數據庫可以通過字段方便的篩選,分組,統計和運算,並且性能十分高效!

總結來說,關係型數據庫不僅維護著一張二維表中行和列的關係,還維護著多張表中一對多,多對多的關係,並能通過SQL處理這種關係進行存取,還提供事務支持!

而非關係型數據庫是以key-value形式存儲數據,可認為是隻有一個主鍵(key),加一個屬性(value)構成的二維表,其value中的屬性之間的關係無法體現,很難通過其中的某個屬性進行統計,分組等關係型數據庫中的常規操作!


非關係型數據庫更容易維護與擴展,關係型數據庫卻因為分表分庫等有一定難度!非關係型數據庫不支持事務,只能使用別的方式支持數據一致性!

mongodb和redis比較的話,redis更適合用做緩存,消息隊列等,而mongodb適用於文檔結構(json等)等的大容量數據存取!

關係型數據庫和非關係型數據庫在不同的場景都大有所為,可根據實際情況擇優使用!

非關係型數據庫和關係型數據庫的區別就說到這,本人持續更新更多的技術分享,敬請關注!


哎喲JAVA不錯哦


關係型數據庫在關係代數為基礎建立起來的一種應用,經過嚴密的完備性證明。也就是說理論上關係型數據庫可用於所有場景。當然這僅僅是理論上的說法,實際上,很多文檔和圖形數據很難採用統一的結構,而且這些數據通常都是海量的。為了提高這些數據的處理效率,人們針對不同的場景設計了不同的算法,這就是非關係型數據庫。值得注意的是非關係型數據庫中保留了關係型數據庫的特徵,是對關係型數據庫應用的一種擴展。NoSQL=Not Only SQL,不僅僅是SQL。

關係型數據庫概要

只要是每行的列都相同的表格都是關係型數據表。這叫第一範型。每行數據都是唯一的關係表叫第二範型。每行數據唯一且能由特定字段確定的關係表叫第三範式,這些特定的字段被稱為主鍵。通常所說的數據庫都滿足第三範型,也就是可用主鍵進行查詢。關係型數據庫有基本的四則運算可以增減列或增減行:選擇,投影,並,交。SQL就是根據這些規則設計出來的。

非關係型數據庫

非關係型數據庫是根據特定的應用場景設計出來的,沒有明確的分類標準,但根據應用場景大致可分為:鍵值存儲,列存儲,文檔型和圖型等幾類。題主所說的Redis是鍵值存儲型的,它不關心文檔的內容,用哈希表存儲了文檔的特徵屬性,方便快速查找文檔,多用於文件管理。MongoDb是文檔型數據庫,管理結構化或者半結構化的格式文檔,可對文檔內容進行高速地全文檢索,也可以建立複雜的文檔分類結構,是鍵值存儲的升級版。至於如何選擇,主要看需求,不需要檢索內容時可使用Redis,輕便易安裝。反之,用MongoDb功能強大。

關係型數據庫是一種基本的數據庫,非關係型數據庫是關係型數據庫的擴展應用。我個人很討厭非關係型數據庫這個叫法,它容易讓人產生誤解,以為NoSQL=No SQL。實際上,還有很多使用其他原理的數據庫,比如,在人工智能領域用一定應用的邏輯型數據庫。這類數據庫比較小眾鮮為人知,稱它們為非關係型數據庫比較貼切。


日衝信息 黃


歡迎關注我,一個程序員老司機,和你分享編程、運營、需求等等經驗和趣事。

作為一個多年的程序員,兩種數據庫都使用過現在將自己的一些感受和你分享一下。

最大的區別



兩種數據庫的最大區別在於存儲方式,關係數據庫是將關係存儲到數據庫裡面,什麼關係呢?就是一對一、一對多和多對多關係,這樣存儲進去之後就能夠通過sql命令查詢到符合客觀需求的數據,但是將關係存儲進行查詢時,有時需要關聯很多個數據表才能夠得到需要的數據,於是就誕生的分關係數據庫,也就是nosql數據庫。

兩種常見的非關係數據庫


一種是redis數據庫,這種數據庫主要做為緩存使用,它一般配合關係數據庫一起用,也就是先從關係數據庫獲取或者計算數據,然後保存到redis數據庫裡面,而mongodb數據庫除了具備redis的特點,也具備關係數據庫的特點,所以一般業務數據還是用它來保存。

那為什麼不用mongodb來代替redis

因為redis非常小巧和專業,已經將緩存做到了極致。


web互聯網


我們首先來說一下關係型和非關係型數據庫的區別,然後再說mongodb和redis。

關係型數據庫,顧名思義就是說裡邊存儲的數據都是關係,就是數學裡說的元組。每個元素都有對應的另一個元素存在。在這種數據庫的中,數據是用二維表來表示的,而表之間是可以有關係的,比如員工表和部門表,每個員工都屬於某一部門,這種關係在關係型數據庫是用外鍵來表示的,員工表中存了部門的ID,那麼在查詢的時候就可以通過這種關係,把員工和部門的信息一同查出來,可以使用SQL的join子句。代表性的數據庫有MySQL, Oracle和PostgreSQL。

非關係型數據庫中數據的表示並不是關係的,有這麼幾種類型,Document類型,以MongoDB為代表,一種是Key-Value類型的,以Redis為代表,還有一種是BigTable類型的,以cassandra為代表。每種都有不同的優勢和功能特性,不過總體上非關係型數據庫的出現是為了更好的適應分佈式系統架構和提升性能。關係型數據庫的Join是非常耗時的一個操作,在大量數據的前提下,性能犧牲的比較多。而非關係型數據庫的設計是denormalized,即通過定義重複的數據來消除join,例如員工和部門,員工數據中會包括部門的相關數據,比如名稱,負責人等。這樣做的代價就是每當部門數據有更新,員工數據也需要做同步的修改,可能會引起數據不一致。所以這兩種數據庫需要根據業務場景來做選擇,是需要高併發,高性能,還是要方便數據的存儲,數據是不是最適合用表的形式來存儲等等。

再來說MongoDB和Redis。

這兩種都是非關係型的數據庫,MongoDB是document類型的,它的存儲格式是bson,是帶有數據類型的json,非常適合給web前端提供數據。MongoDB的數據是存儲在硬盤上,所以會受到硬盤速度的制約。而redis是key-value形式存儲的,體積小,且數據是存在內存中,極大的提高了性能,所以非常適合做緩存和一些臨時數據的存儲,如用於驗證的token。


乾途技術分享


題主要先明白兩種類型,

關係型就常見的oracle,MySQL,等等

非關係緩存中用的多,而且有點像精簡版的關係型!

鍵值對形式或者文檔形式存儲!

非關係不支持SQL,不支持事務,不過速度快啊,性能好!

至於選擇的Redis跟mongdb,要看場景進行選擇了!

因為mongdb以文檔形式存,最好在開發評論系統的時候使用,存json格式數據最為關鍵!

若有幫助,右上角,純手打!個人經驗總結!


服務端開發工程師


關係型數據庫遵循acid(原子性,一致性,隔離性,持久性),非關係型數據庫只要遵循cap(一致性,可用性和分區容忍性),那麼這些屬性的差異也就決定了性能的快慢和建表的數據結構的類型,其中mongodb和redis都屬於nosql,不過mongodb屬於文檔型數據庫,redis屬於內存數據庫


分享到:


相關文章: