{eval=Array;=+count(Array);}
這里的關(guān)系型和非關(guān)系型,主要是數(shù)據(jù)存儲格式的區(qū)別,我們常見的關(guān)系型數(shù)據(jù)庫有Mysql、Oracle、DB2、SQL Server等,都是通過關(guān)系模型來組織數(shù)據(jù),也就是二維表格模型。
而非關(guān)系型數(shù)據(jù)庫,就不是按照這個二維表格來存儲數(shù)據(jù)了,例如Redis是使用鍵值對(key-value)來組織數(shù)據(jù),MongoDB是采用BSON的格式(可以想象成JSON);并且不局限于固定的結(jié)構(gòu)。
關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫之間的關(guān)系,也不是有你沒有,二者選其一,通常都是配合起來使用的。
關(guān)系型數(shù)據(jù)庫,容易理解,使用方便(通過SQL語言操作),易于維護;但是因為數(shù)據(jù)在磁盤上存儲,I/O會成為一個很大的瓶頸,如果在高并發(fā)的場景下,性能降低的很快;另外,對于關(guān)系型數(shù)據(jù)庫,當(dāng)單表數(shù)據(jù)量增加到一定程度的時候,表的操作效率也會很低;表結(jié)構(gòu)固定,當(dāng)數(shù)據(jù)量比較大的時候,對表結(jié)構(gòu)的擴展會是災(zāi)難性的。
非慣性數(shù)據(jù)庫因為數(shù)據(jù)結(jié)構(gòu)的“隨性”,用戶可以根據(jù)需要增加字段,關(guān)系型數(shù)據(jù)習(xí)慣設(shè)計成多張表,然后通過表關(guān)聯(lián)查詢,而非關(guān)系型數(shù)據(jù)庫(文檔性)會把所有字段放到一個集合中,避免多表的關(guān)聯(lián)。不過缺點也非常明顯,“隨性”也就意味著沒有標(biāo)準(zhǔn),單集合有好處也有壞處,沒有完整性約束,對于復(fù)雜的業(yè)務(wù)場景支持比較差。
Redis的數(shù)據(jù)存儲格式是key-value,支持持久化、 支持事務(wù),經(jīng)常用于緩存、高并發(fā)下的讀寫(計數(shù)器、最新列表、秒殺),因為單線程的機制也會用于分布式鎖。
MongoDB的數(shù)據(jù)存儲格式為BSON(類似于JSON),支持快速讀寫,特別是大吞吐量的寫操作;如果表結(jié)構(gòu)不明確,未來可能會發(fā)生很大的變化,非常適合使用MongoDB。
架構(gòu)中可以同時包含關(guān)系型數(shù)據(jù)庫、Redis和MongoDB,各司其職。
歡迎關(guān)注我,一個程序員老司機,和你分享編程、運營、需求等等經(jīng)驗和趣事。
作為一個多年的程序員,兩種數(shù)據(jù)庫都使用過現(xiàn)在將自己的一些感受和你分享一下。
兩種數(shù)據(jù)庫的最大區(qū)別在于存儲方式,關(guān)系數(shù)據(jù)庫是將關(guān)系存儲到數(shù)據(jù)庫里面,什么關(guān)系呢?就是一對一、一對多和多對多關(guān)系,這樣存儲進去之后就能夠通過sql命令查詢到符合客觀需求的數(shù)據(jù),但是將關(guān)系存儲進行查詢時,有時需要關(guān)聯(lián)很多個數(shù)據(jù)表才能夠得到需要的數(shù)據(jù),于是就誕生的分關(guān)系數(shù)據(jù)庫,也就是nosql數(shù)據(jù)庫。
一種是redis數(shù)據(jù)庫,這種數(shù)據(jù)庫主要做為緩存使用,它一般配合關(guān)系數(shù)據(jù)庫一起用,也就是先從關(guān)系數(shù)據(jù)庫獲取或者計算數(shù)據(jù),然后保存到redis數(shù)據(jù)庫里面,而mongodb數(shù)據(jù)庫除了具備redis的特點,也具備關(guān)系數(shù)據(jù)庫的特點,所以一般業(yè)務(wù)數(shù)據(jù)還是用它來保存。
因為redis非常小巧和專業(yè),已經(jīng)將緩存做到了極致。
相信不少人在工作中都遇到過以下對話:
程序員A:又要到流量高峰期了,感覺數(shù)據(jù)庫要崩。
程序員B:嗯嗯,趕緊擴容吧。
雖然數(shù)據(jù)庫很耳熟,但是它究竟是何方神圣呢?今天就給大家科普一下。
數(shù)據(jù)庫,其實就是互聯(lián)網(wǎng)業(yè)務(wù)存儲、查詢數(shù)據(jù)的倉庫。通過幾十年的發(fā)展歷史讓數(shù)據(jù)庫衍生出了各種不同的類型。
關(guān)系型數(shù)據(jù)庫,是指采用了關(guān)系模型來組織數(shù)據(jù)的數(shù)據(jù)庫。例如,某個學(xué)生的信息——姓名:張三,性別:男,學(xué)號:12345,班級:二年級一班,每一個信息之間是有聯(lián)系的,而數(shù)據(jù)也是以表格形式存儲的。
這就是最早的數(shù)據(jù)庫形態(tài),1970年IBM的研究員E.F.Codd博士首先提出關(guān)系模型,在之后的幾十年中,關(guān)系模型的概念得到了充分的發(fā)展并逐漸成為主流數(shù)據(jù)庫結(jié)構(gòu)的主流模型。Oracle、DB2、Microsoft SQL Server、MySQL等都屬于這一范疇。
但是,這類數(shù)據(jù)庫的特點是一致性強,缺點是讀寫性能差。
顧名思義,非關(guān)系型數(shù)據(jù)庫是相對關(guān)系型數(shù)據(jù)庫的一個概念,起初指的是“沒有SQL”的數(shù)據(jù)庫,但現(xiàn)在已經(jīng)公認(rèn)為“no relational”(非關(guān)系型)。非關(guān)系型數(shù)據(jù)庫是根據(jù)特定的應(yīng)用場景設(shè)計出來的,沒有明確的分類標(biāo)準(zhǔn),但根據(jù)應(yīng)用場景大致可分為幾類:1、文檔數(shù)據(jù)庫,沒研究過定義,通常mongodb 就是文檔數(shù)據(jù)庫,特點就是數(shù)據(jù)定義比較靈活。2、Kv數(shù)據(jù)庫,提供的是kv的數(shù)據(jù)表示模式。單機的rocksdb,分布式的tikv之類。3、圖數(shù)據(jù)庫。數(shù)據(jù)可以用圖來定義。4、列式數(shù)據(jù)庫。hbase之類,這里可能有爭議,很多人把hbase 定義為列存。
非關(guān)系型數(shù)據(jù)庫的代表是MongoDB、Redis以及Hbase,其特點與關(guān)系型數(shù)據(jù)庫相反。
之前提到的數(shù)據(jù)庫都屬于傳統(tǒng)數(shù)據(jù)庫和開源數(shù)據(jù)庫,但到了云計算時代,無論是云服務(wù)提供商還是用戶,都需要一個完全為云打造的數(shù)據(jù)庫,于是誕生了全新的產(chǎn)品形態(tài)——云原生數(shù)據(jù)庫。
作為云計算領(lǐng)域的先行者,亞馬遜在2014年11月召開的AWS re:Invent 年度大會上,發(fā)布了云原生數(shù)據(jù)庫Aurora, 讓數(shù)據(jù)庫行業(yè)發(fā)生了翻天覆地的變化。
在亞馬遜之后,許多云廠商也紛紛投入云原生數(shù)據(jù)庫研究。比如2017年9月,ucloud云在國內(nèi)率先發(fā)布自研的云原生數(shù)據(jù)庫POLARDB,它采用了自主研發(fā)分布式存儲引擎,計算服務(wù)器和存儲數(shù)據(jù)分離的架構(gòu)。
如今,國際社會公認(rèn),與傳統(tǒng)商業(yè)數(shù)據(jù)庫相比,云原生數(shù)據(jù)庫擁有以下幾個大優(yōu)勢,是未來的大勢所趨。
1)價格更低
傳統(tǒng)商業(yè)數(shù)據(jù)庫按年、按CPU這樣的方式進行售賣,對大體量的企業(yè)而言,每年需要數(shù)百萬甚至千萬的費用。
云原生數(shù)據(jù)庫按使用量付費,讓用戶可以以非常低的價格就享受到企業(yè)級數(shù)據(jù)庫的服務(wù)。用戶可以根據(jù)自己的業(yè)務(wù)實際發(fā)展情況,按需的購買,可以大大降低企業(yè)在早期發(fā)展過程的成本。
此外,云原生數(shù)據(jù)庫天然是規(guī)模化的,規(guī)模化會帶來成本的下降。這也大大降低單個用戶的成本。例如,ucloud云PolarDB價格僅為商業(yè)數(shù)據(jù)庫的1/10。
2)更強的性能
用戶使用傳統(tǒng)的數(shù)據(jù)庫需要多帶帶購買硬件,然而傳統(tǒng)的數(shù)據(jù)庫廠商則更傾向于去適配通用的硬件,對于一些特定的、前沿的硬件,不會去專門適配,所以傳統(tǒng)數(shù)據(jù)庫用戶無法享受新硬件的紅利。
而云原生數(shù)據(jù)庫的架構(gòu)可以重復(fù)享受硬件變革帶來的紅利,從而實現(xiàn)更強的性能。
3)更快速的迭代,讓數(shù)據(jù)庫更安全穩(wěn)定
云原生數(shù)據(jù)庫可以做到以周,甚至以天為單位來迭代數(shù)據(jù)庫,這是傳統(tǒng)的數(shù)據(jù)庫不可能做到的。當(dāng)系統(tǒng)出現(xiàn)問題時,云原生數(shù)據(jù)庫可以快速進行升級,而傳統(tǒng)數(shù)據(jù)庫升級的周期通常是年,級別是出現(xiàn)了非常嚴(yán)重的漏洞,升級的周期也是以月為單位來計算的。
4)無需關(guān)注部署、運維等,全力專注業(yè)務(wù)開發(fā)
現(xiàn)在是一個快速創(chuàng)新的時代,每家企業(yè)都希望將重要的資源聚焦在自己的核心業(yè)務(wù)開發(fā)上。使用云原生數(shù)據(jù)庫,讓企業(yè)不再需要關(guān)注數(shù)據(jù)庫的部署與運維,開箱即用,全力專注在自己的業(yè)務(wù)開發(fā)和用戶價值上。
對于關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫的區(qū)別就先介紹這么多,如果還有更多想知道的,歡迎留言提問。覺得云原生數(shù)據(jù)庫不錯的,也可以試用一下,也許你會愛上它。
關(guān)系型數(shù)據(jù)庫在關(guān)系代數(shù)為基礎(chǔ)建立起來的一種應(yīng)用,經(jīng)過嚴(yán)密的完備性證明。也就是說理論上關(guān)系型數(shù)據(jù)庫可用于所有場景。當(dāng)然這僅僅是理論上的說法,實際上,很多文檔和圖形數(shù)據(jù)很難采用統(tǒng)一的結(jié)構(gòu),而且這些數(shù)據(jù)通常都是海量的。為了提高這些數(shù)據(jù)的處理效率,人們針對不同的場景設(shè)計了不同的算法,這就是非關(guān)系型數(shù)據(jù)庫。值得注意的是非關(guān)系型數(shù)據(jù)庫中保留了關(guān)系型數(shù)據(jù)庫的特征,是對關(guān)系型數(shù)據(jù)庫應(yīng)用的一種擴展。NoSQL=Not Only SQL,不僅僅是SQL。
只要是每行的列都相同的表格都是關(guān)系型數(shù)據(jù)表。這叫第一范型。每行數(shù)據(jù)都是唯一的關(guān)系表叫第二范型。每行數(shù)據(jù)唯一且能由特定字段確定的關(guān)系表叫第三范式,這些特定的字段被稱為主鍵。通常所說的數(shù)據(jù)庫都滿足第三范型,也就是可用主鍵進行查詢。關(guān)系型數(shù)據(jù)庫有基本的四則運算可以增減列或增減行:選擇,投影,并,交。SQL就是根據(jù)這些規(guī)則設(shè)計出來的。
非關(guān)系型數(shù)據(jù)庫是根據(jù)特定的應(yīng)用場景設(shè)計出來的,沒有明確的分類標(biāo)準(zhǔn),但根據(jù)應(yīng)用場景大致可分為:鍵值存儲,列存儲,文檔型和圖型等幾類。題主所說的Redis是鍵值存儲型的,它不關(guān)心文檔的內(nèi)容,用哈希表存儲了文檔的特征屬性,方便快速查找文檔,多用于文件管理。MongoDb是文檔型數(shù)據(jù)庫,管理結(jié)構(gòu)化或者半結(jié)構(gòu)化的格式文檔,可對文檔內(nèi)容進行高速地全文檢索,也可以建立復(fù)雜的文檔分類結(jié)構(gòu),是鍵值存儲的升級版。至于如何選擇,主要看需求,不需要檢索內(nèi)容時可使用Redis,輕便易安裝。反之,用MongoDb功能強大。
關(guān)系型數(shù)據(jù)庫是一種基本的數(shù)據(jù)庫,非關(guān)系型數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫的擴展應(yīng)用。我個人很討厭非關(guān)系型數(shù)據(jù)庫這個叫法,它容易讓人產(chǎn)生誤解,以為NoSQL=No SQL。實際上,還有很多使用其他原理的數(shù)據(jù)庫,比如,在人工智能領(lǐng)域用一定應(yīng)用的邏輯型數(shù)據(jù)庫。這類數(shù)據(jù)庫比較小眾鮮為人知,稱它們?yōu)榉顷P(guān)系型數(shù)據(jù)庫比較貼切。
相信大家在二級數(shù)據(jù)庫考試的時候都做過這么一道題,關(guān)系型數(shù)據(jù)庫中的關(guān)系是什么意思?答案是:數(shù)據(jù)模型符合滿足一定條件的二維表格式,即是這張二維表中的行都是一個個元素,而列是一個個的屬性,這種結(jié)構(gòu)化的數(shù)據(jù)通過結(jié)構(gòu)化的查詢語言(SQL)可以以不同的方式進行存取!
所以說,SQL的定義和執(zhí)行就代表著關(guān)系型數(shù)據(jù)庫結(jié)構(gòu)的數(shù)據(jù)存取,從where,groupby,order等命令,sum,count等函數(shù)就能一目了然的知道,關(guān)系型數(shù)據(jù)庫可以通過字段方便的篩選,分組,統(tǒng)計和運算,并且性能十分高效!
總結(jié)來說,關(guān)系型數(shù)據(jù)庫不僅維護著一張二維表中行和列的關(guān)系,還維護著多張表中一對多,多對多的關(guān)系,并能通過SQL處理這種關(guān)系進行存取,還提供事務(wù)支持!
而非關(guān)系型數(shù)據(jù)庫是以key-value形式存儲數(shù)據(jù),可認(rèn)為是只有一個主鍵(key),加一個屬性(value)構(gòu)成的二維表,其value中的屬性之間的關(guān)系無法體現(xiàn),很難通過其中的某個屬性進行統(tǒng)計,分組等關(guān)系型數(shù)據(jù)庫中的常規(guī)操作!
非關(guān)系型數(shù)據(jù)庫更容易維護與擴展,關(guān)系型數(shù)據(jù)庫卻因為分表分庫等有一定難度!非關(guān)系型數(shù)據(jù)庫不支持事務(wù),只能使用別的方式支持?jǐn)?shù)據(jù)一致性!
mongodb和redis比較的話,redis更適合用做緩存,消息隊列等,而mongodb適用于文檔結(jié)構(gòu)(json等)等的大容量數(shù)據(jù)存??!
關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫在不同的場景都大有所為,可根據(jù)實際情況擇優(yōu)使用!
非關(guān)系型數(shù)據(jù)庫和關(guān)系型數(shù)據(jù)庫的區(qū)別就說到這,本人持續(xù)更新更多的技術(shù)分享,敬請關(guān)注!
0
回答0
回答0
回答0
回答0
回答0
回答0
回答1
回答0
回答0
回答