偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

NoSQL究竟是什么?了解為什么NoSQL數(shù)據(jù)庫(kù)不是傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)手

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
近年來(lái),我們目睹了NoSQL的興起,并觀察它在各種應(yīng)用中的應(yīng)用。本文旨在對(duì)SQL和NoSQL技術(shù)進(jìn)行客觀比較,并嘗試澄清一些不明確的方面,以幫助人們熟悉地選擇后端。

近年來(lái),我們目睹了NoSQL的興起,并觀察它在各種應(yīng)用中的應(yīng)用。本文旨在對(duì)SQL和NoSQL技術(shù)進(jìn)行客觀比較,并嘗試澄清一些不明確的方面,以幫助人們熟悉地選擇后端。 

我對(duì)NoSQL的態(tài)度

一切都有時(shí)間,2014年我開(kāi)始使用NoSQL。也許我遲到了,但我之前的項(xiàng)目需求完全被傳統(tǒng)數(shù)據(jù)庫(kù)所滿足,所以我沒(méi)有被迫學(xué)習(xí)NoSQL。

NoSQL技術(shù)被神秘的光環(huán)所包圍。我第一次發(fā)現(xiàn)開(kāi)發(fā)人員有一件名為“NoSQL”的東西,他穿著一件帶有“向我詢問(wèn)MongoDB”標(biāo)記的T恤。我當(dāng)時(shí)沒(méi)有問(wèn)過(guò)。我被答案嚇到了,我畫(huà)得很長(zhǎng)很復(fù)雜。然后我看到兩個(gè)不同的方面:誰(shuí)是NoSQL的重要推動(dòng)者,他們討厭舊數(shù)據(jù)庫(kù),而傳統(tǒng)開(kāi)發(fā)人員則拒絕NoSQL的所有好處。

當(dāng)我意識(shí)到這種情況時(shí),我確信我會(huì)發(fā)現(xiàn)并學(xué)習(xí)。這讓我進(jìn)入了一個(gè)小項(xiàng)目,我將這兩個(gè)解決方案與基準(zhǔn)進(jìn)行比較,以顯示NoSQL的所有優(yōu)點(diǎn)和限制。最后,我理解NoSQL和SQL只是為不同項(xiàng)目設(shè)計(jì)的不同工具(即使在某些情況下你需要兩者)。五年后,我無(wú)法確定文化差距是否已經(jīng)填補(bǔ)。這就是為什么我刷新文章,切割無(wú)聊的部分,我在這里重新發(fā)表。

[[276611]]

 

什么是NoSQL

簡(jiǎn)單來(lái)說(shuō),NoSQL是一個(gè)不遵循關(guān)系數(shù)據(jù)庫(kù)模型的新數(shù)據(jù)存儲(chǔ)后端。這意味著我們所說(shuō)的“容器”與傳統(tǒng)的基于SQL的后端的工作方式不同。

NoSQL技術(shù)的誕生是為了滿足傳統(tǒng)數(shù)據(jù)庫(kù)已經(jīng)成熟時(shí)出現(xiàn)的一系列新需求。當(dāng)然,在最近幾年,應(yīng)用程序需求發(fā)生了變化,變得更加挑剔(大數(shù)據(jù),集群,文件存儲(chǔ)庫(kù)),因此這個(gè)新的存儲(chǔ)系統(tǒng)的設(shè)計(jì)考慮到了這些新的需求。

但是,我的意思是“要求”?這里有一組NoSQL旨在支持的案例。

  • 該應(yīng)用程序使用大量數(shù)據(jù)(大數(shù)據(jù))
  • 該應(yīng)用程序使用快速更改關(guān)系和數(shù)據(jù)類型(半結(jié)構(gòu)化,非結(jié)構(gòu)化和多態(tài)數(shù)據(jù))的數(shù)據(jù)。
  • 開(kāi)發(fā)人員使用敏捷方法在一個(gè)小團(tuán)隊(duì)中工作:針對(duì)長(zhǎng)期瀑布迭代的許多小沖刺
  • 作為服務(wù)的應(yīng)用程序可以在Web上發(fā)布
  • 為數(shù)千名用戶而非公司內(nèi)部的少數(shù)人提供的應(yīng)用程序
  • 對(duì)應(yīng)用程序的未來(lái)負(fù)載一定不確定:需要具有可擴(kuò)展性和動(dòng)態(tài)性,需要輕松地在后端集群上使用基礎(chǔ)軟件

市場(chǎng)上提供了許多NoSQL解決方案,無(wú)論是開(kāi)源還是非開(kāi)源。它們中的每一個(gè)都有所不同,可能專門(mén)針對(duì)某些特定需求,但基本思想和共同特征是提供更好的可擴(kuò)展性和性能。為此,他們放棄了通用RDBMS的一些功能,引入了新功能,但保留了足夠的功能。

NoSQL實(shí)現(xiàn)

SQL DB的一個(gè)重大變化是SQL后端是一個(gè)通用存儲(chǔ)系統(tǒng),NoSQL分發(fā)專注于特定類型的數(shù)據(jù)。這允許DB在其范圍內(nèi)更有效,并允許我們擁有更高性能的系統(tǒng)。在本節(jié)中,我們將討論NoSQL數(shù)據(jù)庫(kù)的應(yīng)用程序。請(qǐng)注意,它們可以一起使用(也可以與傳統(tǒng)的SQL系統(tǒng)一起使用),以便從不同的技術(shù)中獲得最佳效果。

文檔導(dǎo)向

這種類型的數(shù)據(jù)庫(kù)不需要具有一致的數(shù)據(jù)結(jié)構(gòu),因此當(dāng)您必須處理多態(tài)數(shù)據(jù)或數(shù)據(jù)結(jié)構(gòu)不斷變化時(shí),它們非常有用。這種后端可以將標(biāo)準(zhǔn)化實(shí)體(如鍵值數(shù)據(jù)集或EAV模型)轉(zhuǎn)換為簡(jiǎn)單的文檔集。

  • 目標(biāo):存儲(chǔ)非類型的“記錄”集,稱為“文檔”
  • 示例: MongoDB,CouchDB
  • 目標(biāo):異構(gòu)數(shù)據(jù),面向工作,敏捷開(kāi)發(fā)

圖數(shù)據(jù)庫(kù)

我們被告知NoSQL數(shù)據(jù)庫(kù)已經(jīng)刪除了關(guān)系的概念以實(shí)現(xiàn)更好的性能。在這種DB中,這不是真的。相反,圖形數(shù)據(jù)庫(kù)強(qiáng)制執(zhí)行關(guān)系概念。

他們的目標(biāo)是通過(guò)與其他數(shù)據(jù)的關(guān)系來(lái)定義數(shù)據(jù)。當(dāng)大多數(shù)數(shù)據(jù)結(jié)構(gòu)被設(shè)計(jì)為保持與實(shí)體的關(guān)系時(shí)(即,當(dāng)存在大多數(shù)外鍵列時(shí),如果有很多表),這種數(shù)據(jù)庫(kù)可能很有用。

  • 目標(biāo):描述數(shù)據(jù)關(guān)系
  • 示例: Neo4j,GiraffeDB。
  • 目標(biāo):數(shù)據(jù)挖掘

鍵值商店

這是一種用于存儲(chǔ)大量鍵值對(duì)數(shù)據(jù)的DB。當(dāng)數(shù)據(jù)庫(kù)用于存儲(chǔ)屬性,轉(zhuǎn)換或緩存目的時(shí),這可能很有用。

  • 目標(biāo):以鍵值形式存儲(chǔ)數(shù)據(jù)
  • 示例: Redis,Cassandra,MemcacheDB
  • 目標(biāo):鍵值存儲(chǔ)

NoSQL的優(yōu)點(diǎn)

我們知道NoSQL DB有一些有趣的優(yōu)點(diǎn),它們可以解決傳統(tǒng)RDMS無(wú)法解決的問(wèn)題。如今,他們?cè)陉P(guān)鍵系統(tǒng)中的大量工作,如大型云系統(tǒng)和一些大型SaaS產(chǎn)品,確認(rèn)它們已經(jīng)成熟且有用。但問(wèn)題是,為什么我應(yīng)該轉(zhuǎn)向他們?在這種情況下,何時(shí)移動(dòng)有利可圖?我們不能只根據(jù)我們的印象做出這樣的決定,并閱讀一些供應(yīng)商宣傳冊(cè),其中NoSQL非??崾遣粔虻?。而且,我們不能因?yàn)楹ε伦兓A粼诓怀浞值钠脚_(tái)上。

在本節(jié)中,我將嘗試解釋為什么這個(gè)解決方案可以很好地轉(zhuǎn)移到哪個(gè)用例使其更有利可圖。

正如我們所說(shuō),NoSQL數(shù)據(jù)庫(kù)的創(chuàng)建是為了響應(yīng)傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)技術(shù)的局限性。這意味著我們會(huì)發(fā)現(xiàn)一些改進(jìn),或者更好的是,傳統(tǒng)RDBMS中的某些功能不存在且無(wú)法添加,即使生產(chǎn)者會(huì)實(shí)現(xiàn)它們。

NoSQL的優(yōu)點(diǎn)包括易于處理的功能:

  • 大數(shù)據(jù):使用這個(gè)術(shù)語(yǔ),我們描述了包含大量數(shù)據(jù)的數(shù)據(jù)集。
  • 可變數(shù)據(jù):數(shù)據(jù)也可以是結(jié)構(gòu)化的,半結(jié)構(gòu)化的和非結(jié)構(gòu)化的。NoSQL還可以管理數(shù)據(jù)轉(zhuǎn)換。
  • 動(dòng)態(tài)開(kāi)發(fā):在我們需要敏捷沖刺,快速迭代,頻繁代碼推送以及總結(jié)以響應(yīng)變化的環(huán)境中,擁有一個(gè)包含動(dòng)態(tài)的數(shù)據(jù)庫(kù)是非常有幫助的。
  • 面向?qū)ο螅?/strong>易于使用且靈活的編程
  • 可擴(kuò)展:我們可以輕松實(shí)現(xiàn)高效,可擴(kuò)展的架構(gòu),而不是昂貴的單片架構(gòu)。即使在傳統(tǒng)的數(shù)據(jù)庫(kù)中,我們也能做到這一點(diǎn),但它更難,更有限。
  • 開(kāi)源:大多數(shù)解決方案都是開(kāi)源的,因此無(wú)需許可證

綜上所述:

NoSQL數(shù)據(jù)庫(kù)更具可擴(kuò)展性并提供更好的性能,并且它們的數(shù)據(jù)模型更接近應(yīng)用程序內(nèi)部使用的域模型?;贜oSQL數(shù)據(jù)庫(kù)啟動(dòng)項(xiàng)目的公司數(shù)量正在增長(zhǎng)。NoSQL數(shù)據(jù)庫(kù)也往往是開(kāi)源的,這意味著開(kāi)發(fā),實(shí)現(xiàn)和共享軟件的成本相對(duì)較低。

NoSQL的限制

在評(píng)估NoSQL數(shù)據(jù)庫(kù)的局限性時(shí),重要的是要記住NoSQL世界是一個(gè)多樣化的生態(tài)系統(tǒng)。并非所有NoSQL存儲(chǔ)產(chǎn)品都具有相同程度的所有缺點(diǎn)。這是一件好事,因?yàn)檫@意味著在權(quán)衡不同NoSQL解決方案的優(yōu)缺點(diǎn)時(shí),組織有很多選擇,以決定哪一個(gè)最適合他們的特定需求。本章總結(jié)了使用NoSQL解決方案可能會(huì)遺漏的一些功能。

通過(guò)閱讀這篇文章,你會(huì)發(fā)現(xiàn)本章擴(kuò)展的不僅僅是優(yōu)勢(shì)之一。這不是阻止使用NoSQL的方法。本章將對(duì)NoSQL技術(shù)的所有限制進(jìn)行公正的描述,并且只是想讓您了解使用它們時(shí)可能遇到的每個(gè)問(wèn)題。許多要點(diǎn)可能會(huì)因?qū)嵤┒兴煌?,?dāng)我說(shuō)支持的工具很少時(shí),大多數(shù)工具都適合,但并非所有工具都適用),因此請(qǐng)將它們視為一個(gè)概述,提醒您可能存在的風(fēng)險(xiǎn)找。我期望的是,在您選擇使用NoSQL產(chǎn)品之后,您可以使用本章作為核對(duì)表來(lái)了解您的特定數(shù)據(jù)庫(kù)中是否存在此問(wèn)題以及它是否與應(yīng)用程序相關(guān)。

安全

安全是每個(gè)人都想要的,但很難達(dá)到。從理論上講,每種技術(shù)都可能存在安全問(wèn)題。SQL系統(tǒng)上也存在安全問(wèn)題,也許存在安全問(wèn)題。那么為什么我將此標(biāo)記為NoSQL的可能問(wèn)題?

關(guān)于安全性的NoSQL“概念”沒(méi)有真正的問(wèn)題,但我們可能會(huì)遇到與我們采用的產(chǎn)品的成熟度相關(guān)的安全問(wèn)題。產(chǎn)品增長(zhǎng)時(shí)出現(xiàn)安全問(wèn)題,然后修復(fù)。直觀地說(shuō),年輕的產(chǎn)品可能有許多未知的安全問(wèn)題。此外,一個(gè)年輕的產(chǎn)品在市場(chǎng)上銷售的時(shí)間較短,因此顧問(wèn)沒(méi)有時(shí)間獲得它們的經(jīng)驗(yàn),許多安全限制可以忽略不計(jì)。所以,問(wèn)題是大多數(shù)NoSQL平臺(tái)的新特性。對(duì)于商業(yè)用途,我建議使用成熟的解決方案,背后有供應(yīng)商。

數(shù)據(jù)一致性

當(dāng)我們開(kāi)始學(xué)習(xí)RDBMS時(shí),他們告訴我們ACID事務(wù)是使整個(gè)數(shù)據(jù)庫(kù)保持一致的操作的最佳選擇。好吧,大多數(shù)NoSQL技術(shù)都沒(méi)有實(shí)現(xiàn)這種交易。NoSQL系統(tǒng)基于最終一致性原則。在實(shí)踐中,擁抱一點(diǎn)風(fēng)險(xiǎn)(一個(gè)節(jié)點(diǎn)可能與其他節(jié)點(diǎn)不同步),它們會(huì)獲得一些性能提升。是的,這是妥協(xié),但我們不能擁有一切。

我必須提到一些NoSQL實(shí)現(xiàn),比如FoundationDB,允許類似ACID的事務(wù)保持NoSQL性能高。順便說(shuō)一下,當(dāng)我們繼續(xù)使用NoSQL時(shí),數(shù)據(jù)一致性仍然是一個(gè)關(guān)鍵部分:基于您正在開(kāi)發(fā)的應(yīng)用程序,這可能是一個(gè)問(wèn)題。

JOIN的

當(dāng)您與試圖將您轉(zhuǎn)換為NoSQL技術(shù)的人交談時(shí),您可以從中聽(tīng)到的第一個(gè)好處之一是由于刪除關(guān)系而帶來(lái)的性能優(yōu)勢(shì)。我們都同意一種關(guān)系可能會(huì)降低性能,但我們會(huì)失去什么呢?

想象一下,你在徒步旅行時(shí)背著沉重的背包。當(dāng)然,放棄它你會(huì)更快。這樣做很方便嗎?取決于這個(gè)包裝包含什么,這取決于背包內(nèi)容的價(jià)值是什么。如果它包含一個(gè)夜晚的帳篷,也許最好在一小時(shí)后到達(dá)目的地,但要保持溫暖而不是走得更快。如果你帶來(lái)有用的一次性用品,也許你可以做相反的事情。

遵循這種并行性,我們是否可以接受松散的一致性以獲得性能?方便值得嗎?

退后一步,我將從連接的起源開(kāi)始。RDBMS使用該關(guān)系將數(shù)據(jù)從一個(gè)表鏈接到另一個(gè)表,以將數(shù)據(jù)保存在一個(gè)位置而不復(fù)制它們。構(gòu)造連接以允許我們?cè)诓樵冎兄匦逻B接它們。當(dāng)然,在表之間進(jìn)行連接需要額外的計(jì)算成本,而不是直接在要查詢的表中查找數(shù)據(jù)。但是這個(gè)成本對(duì)于保持關(guān)系(沒(méi)有復(fù)制,一致性)是必要的。

很明顯,雖然這個(gè)功能有可接受的開(kāi)銷,但這沒(méi)關(guān)系,可能是最好的選擇。但什么時(shí)候它減慢了一切或需要太多的硬件?這個(gè)問(wèn)題允許NoSQL開(kāi)發(fā)人員聲稱缺少JOIN到一個(gè)功能,但NoSQL始終是解決方案嗎?

不總是。有時(shí)我們只需要重新設(shè)計(jì)數(shù)據(jù)庫(kù)結(jié)構(gòu),可能會(huì)刪除一些關(guān)系或重組數(shù)據(jù)。是的,我們將失去一些關(guān)系,或者我們將復(fù)制日期的某些部分,但它可以接受(在NoSQL中我們將失去所有的關(guān)系)。

另一個(gè)問(wèn)題是一致性??紤]類別和產(chǎn)品。我們可能有一個(gè)嵌套的類別樹(shù),許多產(chǎn)品作為樹(shù)的葉子。在傳統(tǒng)的RDMS中,更改類別樹(shù)只是對(duì)類別表上的外鍵(自我關(guān)系)的更新。這些更改會(huì)自動(dòng)反映所有子類別和產(chǎn)品。在NoSQL中,我們可以在所有類別/產(chǎn)品上擁有冗余數(shù)據(jù),并且需要對(duì)子元素進(jìn)行大量更新。

棘手的交易

讓我假設(shè)我們的應(yīng)用程序可以放棄JOIN以獲得速度,在我們的例子中,這是一個(gè)可接受的權(quán)衡。我們說(shuō)過(guò),在許多NoSQL實(shí)現(xiàn)中,很難保持各種條目的一致性。當(dāng)您在沒(méi)有事務(wù)的情況下工作時(shí),您可以按順序執(zhí)行許多操作,但過(guò)了一段時(shí)間后會(huì)出現(xiàn)不一致 這對(duì)于NoSQL的第一次實(shí)現(xiàn)是正確的,并且一些新技術(shù)試圖給出事務(wù)。您還可以考慮在應(yīng)用程序級(jí)別管理事務(wù),嘗試回滾臟數(shù)據(jù),但在許多情況下可能很難管理。

缺少供應(yīng)商技術(shù)的標(biāo)準(zhǔn)

SQL是一種標(biāo)準(zhǔn)語(yǔ)言。可能會(huì)有許多變化帶來(lái)特定的方言,但這很復(fù)雜并不禁止抽象數(shù)據(jù)訪問(wèn)。想想Hibernate,NHibernate,Doctrine,Entity Framework或其他ORM。它們證明了SQL方言之間的區(qū)別并不重要。我們可以得出結(jié)論,即使許多供應(yīng)商實(shí)現(xiàn)了不同的數(shù)據(jù)庫(kù)技術(shù),SQL也是一種標(biāo)準(zhǔn)語(yǔ)言。此外,如果您不是基于ORM層,如果您為DB生成查詢,則大多數(shù)代碼可以在其他代碼中重用。這使遷移更容易,開(kāi)發(fā)人員可以快速適應(yīng)不同的DB解決方案。

另一方面,在NoSQL世界中,存在更多混亂。每個(gè)供應(yīng)商實(shí)現(xiàn)其特定語(yǔ)法,而不涉及任何共享標(biāo)準(zhǔn)。這意味著在不同的NoSQL實(shí)現(xiàn)之間遷移應(yīng)用程序更加困難。這意味著找到一個(gè)熟悉許多NoSQL技術(shù)的程序員更難。

架構(gòu)靈活性可能是一個(gè)麻煩

NoSQL系統(tǒng)的一個(gè)特點(diǎn)是它們不需要架構(gòu)。在實(shí)踐中,程序員在保存數(shù)據(jù)時(shí)決定數(shù)據(jù)結(jié)構(gòu)。因此,沒(méi)有任何地方可以寫(xiě)出數(shù)據(jù)的結(jié)構(gòu)以及數(shù)據(jù)的含義。即使您可以使用某種自動(dòng)化工具輕松地從數(shù)據(jù)關(guān)系重新創(chuàng)建數(shù)據(jù)庫(kù)模型,這可能是傳統(tǒng)應(yīng)用程序中缺少的。

而且,如果發(fā)生錯(cuò)誤怎么辦?我們知道可能存在代碼出錯(cuò)的情況。傳統(tǒng)的RDMS是腳手架,因此如果您切換某些字段或者您的字段格式錯(cuò)誤,它們可以保護(hù)您免受不一致。在NoSQL的情況下,DB沒(méi)有任何幫助,因?yàn)闆](méi)有定義任何模式,沒(méi)有任何關(guān)于數(shù)據(jù)的信息應(yīng)該保存:沒(méi)有人可以說(shuō)數(shù)據(jù)是否錯(cuò)誤。最糟糕的副作用是,該過(guò)程為開(kāi)發(fā)人員帶來(lái)了很多權(quán)力和很多責(zé)任,通常不了解所有流程或完整結(jié)構(gòu)。

而且,即使你現(xiàn)在知道什么是保存的,你認(rèn)為你會(huì)記得下個(gè)月的所有內(nèi)容?和第二年?并非所有項(xiàng)目都需要持續(xù)開(kāi)發(fā),在我們需要進(jìn)行一些更改之前,可能會(huì)有一個(gè)業(yè)務(wù)應(yīng)用程序保持原樣多年。

在IT部門(mén),公司通常會(huì)將項(xiàng)目委托給某個(gè)供應(yīng)商,因此必須考慮這一部分,以確保在項(xiàng)目結(jié)束時(shí)輕松移交,可能要求準(zhǔn)確記錄有關(guān)數(shù)據(jù)的結(jié)構(gòu)以及每個(gè)字段/集合的含義。與模式靈活性相關(guān)的最后一個(gè)問(wèn)題是團(tuán)隊(duì)中的每個(gè)成員都無(wú)法在項(xiàng)目中工作,因此,對(duì)于小團(tuán)隊(duì)來(lái)說(shuō),流量是至關(guān)重要的并非所有成員都對(duì)數(shù)據(jù)結(jié)構(gòu)有完整的了解,或者沒(méi)有足夠的文檔。

Analytics(分析)

將多個(gè)嵌套數(shù)據(jù)保存在單個(gè)文檔中可能會(huì)丟失“SUM”,“COUNT”等分析功能。在第一次應(yīng)用程序開(kāi)發(fā)期間這可能不是問(wèn)題的壞事,但有人可能會(huì)在稍后詢問(wèn)某些報(bào)告,那么在這種情況下該怎么做?在填充數(shù)據(jù)庫(kù)之后很難改變數(shù)據(jù)結(jié)構(gòu),并且由于明確定義的數(shù)據(jù)結(jié)構(gòu)的泄漏,這樣做可能具有不可預(yù)測(cè)的影響。分析對(duì)于NoSQL來(lái)說(shuō)是一個(gè)難點(diǎn)。

此外,雖然有許多商業(yè)工具可以連接到傳統(tǒng)數(shù)據(jù)庫(kù)來(lái)管理分析部分,但對(duì)NoSQL系統(tǒng)的支持有限。

可以采取的另一個(gè)解決方案是在NoSQL DB中復(fù)制某種與非結(jié)構(gòu)化數(shù)據(jù)的“關(guān)系”,可能會(huì)創(chuàng)建許多集合并將對(duì)象與其他集合鏈接起來(lái)。如果您計(jì)劃遵循此路徑以允許分析報(bào)告,請(qǐng)記住,這可能會(huì)降低性能,使其與標(biāo)準(zhǔn)SQL系統(tǒng)相媲美。當(dāng)此DB中涉及的部分最小且記錄數(shù)量有限時(shí),這是可以接受的。無(wú)論如何,即使根據(jù)我的經(jīng)驗(yàn),構(gòu)造允許加入NoSQL查詢的數(shù)據(jù),因?yàn)楸澈鬀](méi)有明確定義的關(guān)系,非常有限并且性能不如我們預(yù)期的那么好(即,在撰寫(xiě)本文時(shí)) ,MongoDB不支持內(nèi)連接,每次只能進(jìn)化到表而不創(chuàng)建臨時(shí)表)。

更少的工具

我們談到了NoSQL查詢語(yǔ)言和語(yǔ)法缺乏標(biāo)準(zhǔn)化。這個(gè)問(wèn)題也可以反映在工具中,以及大多數(shù)平臺(tái)的年輕性。我說(shuō)的是用于查詢的工具,也用于在數(shù)據(jù)庫(kù)之間遷移數(shù)據(jù),管理備份等。當(dāng)然,大多數(shù)NoSQL項(xiàng)目正在增長(zhǎng),我們期望工具會(huì)隨之增長(zhǎng),所以這個(gè)問(wèn)題會(huì)在某些時(shí)候自動(dòng)解決。

缺乏標(biāo)準(zhǔn)化使第三方供應(yīng)商難以構(gòu)建可支持多種NoSQL解決方案的工具。此外,年輕平臺(tái)意味著更少的用戶,更少的客戶,更少的時(shí)間來(lái)開(kāi)發(fā)成熟的工具。

性能比較

指定比較的方式很重要。首先,我需要將兩種解決方案置于相同的條件下。這意味著,例如,使用相同的硬件并具有相同的調(diào)整級(jí)別。所以我在同一臺(tái)機(jī)器上安裝了MongoDB(最新版本)和SQLServer Express。因?yàn)槲覀儗?duì)數(shù)據(jù)庫(kù)本身的性能不感興趣,所以我使用基于標(biāo)準(zhǔn)框架的C#代碼構(gòu)建了我的基準(zhǔn)測(cè)試。

通過(guò)這兩種方式來(lái)保存數(shù)據(jù),一切都是共享的(實(shí)體,邏輯,數(shù)據(jù)生成)以確保公平。

我們將比較的所有操作列表:

  • 質(zhì)量插入
  • 詢問(wèn)
  • 分析
  • 事務(wù)(或更好,在NoSQL情況下,事務(wù)模擬)

對(duì)單個(gè)實(shí)體的批量操作

該基準(zhǔn)測(cè)試包含一組可在較短時(shí)間內(nèi)插入的對(duì)象。使用越來(lái)越多的項(xiàng)目來(lái)復(fù)制此測(cè)試以保存以證明兩個(gè)系統(tǒng)中的性能規(guī)模。該基準(zhǔn)測(cè)試以毫秒為單位測(cè)量執(zhí)行時(shí)間,并堅(jiān)持使用單個(gè)表/集合。

NoSQL究竟是什么?了解為什么NoSQL數(shù)據(jù)庫(kù)不是傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)手

 

搜索

此基準(zhǔn)測(cè)試側(cè)重于查詢功能。我們將以下模式分開(kāi):

  • CASE 1使用主鍵獲取一個(gè)實(shí)體:此模式用于從DB獲取單個(gè)實(shí)體,使用唯一標(biāo)識(shí)符
  • CASE 2完全掃描失?。?/strong>當(dāng)您要查找已刪除的元素時(shí),數(shù)據(jù)庫(kù)必須在回復(fù)“否”之前掃描所有索引。
  • CASE 3分頁(yè)查詢:一個(gè)復(fù)雜的查詢,其中有一些過(guò)濾器,一個(gè)訂單條件,并且您只想獲取一頁(yè)數(shù)據(jù)。

我創(chuàng)建了一些基準(zhǔn)模擬上面不同比例的模式。在一個(gè)示例中,第一個(gè)基準(zhǔn)假定5%的類型1的查詢,70%的類型2和25%的類型3.該基準(zhǔn)測(cè)量以ms為單位的執(zhí)行時(shí)間。此基準(zhǔn)測(cè)試堅(jiān)持使用單個(gè)表\集合。

您可以在git-hub上找到用于執(zhí)行這些測(cè)試的所有代碼。

第一個(gè)測(cè)試是在“小”數(shù)據(jù)集上,大約2.500,000行。

對(duì)“更大”的數(shù)據(jù)集進(jìn)行第二次測(cè)試,大約5M行。

此基準(zhǔn)測(cè)試突出顯示了對(duì)索引的查詢性能的重大改進(jìn),但是當(dāng)使用MongoDB讀取一組數(shù)據(jù)時(shí),增益會(huì)降低并且在數(shù)據(jù)增加時(shí)保持穩(wěn)定。

NoSQL究竟是什么?了解為什么NoSQL數(shù)據(jù)庫(kù)不是傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)手

 

交易

我們知道NoSQL世界的事務(wù)大多不受支持。我們也明白放棄交易可以從表演中獲益,一個(gè)問(wèn)題是:我從中獲得多少收益?我構(gòu)建了這個(gè)基準(zhǔn)來(lái)比較插入與一個(gè)與許多孩子相關(guān)的主行的事務(wù)。基準(zhǔn)測(cè)試的重點(diǎn)是執(zhí)行時(shí)間,以ms表示。

NoSQL究竟是什么?了解為什么NoSQL數(shù)據(jù)庫(kù)不是傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)手

 

Analytics(分析)

該基準(zhǔn)專注于分析。假設(shè)我們有一個(gè)分類的主 - 詳細(xì)數(shù)據(jù)模型,您希望:

  • export:整個(gè)加入整體數(shù)據(jù)樹(shù)
  • 報(bào)告:匯總所有類別的所有項(xiàng)目,即為所有客戶提供發(fā)票金額
  • 關(guān)鍵績(jī)效指標(biāo):總結(jié)所有總計(jì)總計(jì)詳細(xì)小計(jì)

在內(nèi)連接后的4M行的基礎(chǔ)上:

NoSQL究竟是什么?了解為什么NoSQL數(shù)據(jù)庫(kù)不是傳統(tǒng)數(shù)據(jù)庫(kù)的對(duì)手

 

興趣點(diǎn)

革命在科技領(lǐng)域是不可避免的。新技術(shù)帶來(lái)了一些革命性的功能,但往往不得不打敗開(kāi)發(fā)人員的先入之見(jiàn)。有時(shí)他們會(huì)被誤解,所以他們的弱點(diǎn)在他們受雇后就會(huì)出現(xiàn)。

關(guān)于創(chuàng)新,我們必須“對(duì)立”人群:

  1. “熱心”的人:希望無(wú)條件地接受變革,并準(zhǔn)備好處理過(guò)去所做的一切,以便使用最后的技術(shù);
  2. “保守派”人:討厭改變,寧愿保持其習(xí)慣,拒絕任何新技術(shù)。

在現(xiàn)實(shí)生活中,我們必須保持中間位置,因此了解和了解新技術(shù)可以為我們做些什么并準(zhǔn)備好在項(xiàng)目需要之前采用新技術(shù)非常重要。“在工作中進(jìn)行審判”是一種可能導(dǎo)致不良后果的壞習(xí)慣。

同樣的原則適用于NoSQL技術(shù)。因?yàn)槲覀冎翱催^(guò)NoSQL,現(xiàn)在我們知道贊成和利弊,所以我們可以利用這種工具。當(dāng)我們分析這項(xiàng)技術(shù)時(shí),我們不能停止從傳統(tǒng)習(xí)慣(如交易,模式和標(biāo)準(zhǔn))中看到我們想念的東西。我們需要研究和熟悉這些技術(shù),這些技術(shù)在幾年前還很年輕,但現(xiàn)在卻是一個(gè)具體的選擇。學(xué)習(xí),學(xué)習(xí),理解,使用:這是進(jìn)步的本質(zhì)。

什么時(shí)候我應(yīng)該使用NoSQL Db?

為什么NoSQL會(huì)比使用SQL數(shù)據(jù)庫(kù)更好?閱讀完本文后,我確信您會(huì)理解NoSQL不是SQL數(shù)據(jù)庫(kù)的替代品,而是具有不同功能的不同存儲(chǔ)系統(tǒng),并且在某些特定領(lǐng)域中非常有用。所以答案不能與“它取決于”有所不同。因?yàn)樗Q于項(xiàng)目的許多特征。

說(shuō)實(shí)話,謹(jǐn)慎,當(dāng)以下所有陳述都成立時(shí),NoSQL是最佳解決方案:

  • 當(dāng)您的項(xiàng)目需要擴(kuò)展時(shí),或?qū)?lái)可能。
  • 當(dāng)你必須處理大數(shù)據(jù)時(shí),或者你的數(shù)據(jù)在不久的將來(lái)會(huì)變得很大
  • 當(dāng)應(yīng)用程序中的分析組件簡(jiǎn)單或不那么重要時(shí)
  • 當(dāng)您的應(yīng)用程序需要適合數(shù)據(jù)庫(kù)目的時(shí)(即您在圖表和數(shù)據(jù)庫(kù)中保存數(shù)據(jù))

在某些情況下,NoSQL可能是一個(gè)很好的選擇,但對(duì)于構(gòu)​​建耐用的基礎(chǔ)架構(gòu)并不是必不可少的。當(dāng)然,如果在您的應(yīng)用程序中,NoSQL系統(tǒng)覆蓋了99%的所有需求,則沒(méi)有理由將其與RDBMS結(jié)合使用。但是,如果您需要標(biāo)準(zhǔn)RDBMS的關(guān)系,事務(wù)和其他功能,可能最好將它們用作主存儲(chǔ)系統(tǒng),并使用NoSQL僅覆蓋關(guān)鍵部分(可能源自數(shù)據(jù)的大?。?/p>

在上面的情況下,表現(xiàn)有多好?

這取決于具體的用例。從一方面來(lái)說(shuō),我們?cè)诖笮捅砘虼罅渴褂梅矫嬗泻芏嗪锰?,但從另一方面?lái)說(shuō),我們使用查找而不是加入小型數(shù)據(jù)集會(huì)有一些性能損失。一個(gè)現(xiàn)實(shí)的估計(jì),如果有使用NoSQL DB的基礎(chǔ),我們可以將性能從10提高到100。當(dāng)然,這種估計(jì)考慮了應(yīng)用程序的所有方面,并且與最終用戶體驗(yàn)有關(guān)。這意味著您可以在數(shù)據(jù)庫(kù)層上測(cè)量更好的加速,但最終用戶體驗(yàn)會(huì)因許多減少差距的因素(緩存,網(wǎng)絡(luò)延遲,頁(yè)面呈現(xiàn))而失真。

只是為了解釋我所說(shuō)的內(nèi)容,當(dāng)有一個(gè)頁(yè)面進(jìn)行查詢并返回?cái)?shù)據(jù)時(shí),請(qǐng)參考示例中的極限情況。假設(shè)此頁(yè)面使用傳統(tǒng)數(shù)據(jù)庫(kù)獲取結(jié)果為500毫秒,使用NoSQL為50毫秒,渲染頁(yè)面為200毫秒,通過(guò)互聯(lián)網(wǎng)傳輸數(shù)據(jù)為1秒。DB層的性能提升為-90%,但對(duì)于最終用戶,1700只增加了450ms,因此只有26%。通過(guò)這個(gè)例子,我會(huì)解釋說(shuō)很難衡量復(fù)雜系統(tǒng)的改進(jìn),在很多情況下,NoSQL還不足以解決性能問(wèn)題。更直接的是,如果您考慮解決因遷移到NoSQL的應(yīng)用程序中的設(shè)計(jì)不良而導(dǎo)致的性能問(wèn)題,那么您就沒(méi)有走上正確的道路。

但最大的問(wèn)題是:為了獲得這種表現(xiàn),我失去了什么?因?yàn)樵谀承┣闆r下,不可能放棄某些功能,如交易或關(guān)系。在移動(dòng)之前理解這一點(diǎn)非常重要。

NoSQL系統(tǒng)在生產(chǎn)環(huán)境中應(yīng)用是否成熟?

這主要取決于您的需求,或更好地取決于項(xiàng)目要求。我們可以說(shuō)NoSQL肯定足夠成熟。所以,如果你需要它,你可以毫無(wú)顧慮地使用它。但并非所有應(yīng)用程序都需要處理大數(shù)據(jù)或大規(guī)模擴(kuò)展。大多數(shù)Saas產(chǎn)品確實(shí)如此,在企業(yè)環(huán)境中也有很多關(guān)鍵應(yīng)用程序,但現(xiàn)在大多數(shù)應(yīng)用程序仍然非常簡(jiǎn)單。

根據(jù)我的經(jīng)驗(yàn),很難在數(shù)據(jù)庫(kù)中找到超過(guò)10萬(wàn)行的表。想想你的數(shù)據(jù)庫(kù),排除你上面的2-3個(gè)更大的表并查看行數(shù)。它們有多大?DB應(yīng)用程序上的常用DB結(jié)構(gòu)計(jì)數(shù)很多“小”表(小于10萬(wàn)行)相關(guān)。對(duì)于這種類型的應(yīng)用程序,傳統(tǒng)的RDBMS就足夠了,它將永遠(yuǎn)存在。重要的是,而不是開(kāi)始使用它,就是要了解在您的案例需要時(shí)準(zhǔn)備好的利益和發(fā)展模式。

SQL過(guò)時(shí)了嗎?

當(dāng)男人發(fā)明飛機(jī)時(shí),汽車已經(jīng)過(guò)時(shí)了?不,當(dāng)然。如果飛機(jī)比汽車快。它們只是兩種不同的系統(tǒng)來(lái)移動(dòng)人,具有不同的特征。根據(jù)您的旅行類型,您在旅行和預(yù)算上花費(fèi)的時(shí)間,您將決定什么是最適合您的選擇。同樣,NoSQL即將推出過(guò)時(shí)的SQL。它們只是兩種不同的存儲(chǔ)數(shù)據(jù)的方式,具有不同的特征。您將根據(jù)自己的需求決定什么是最適合您的。

SQL不適合存在問(wèn)題,因此您不必使用它來(lái)啟動(dòng)大數(shù)據(jù)項(xiàng)目。這將是試圖用汽車而不是飛機(jī)到達(dá)島嶼。但SQL仍然有其優(yōu)勢(shì)。許多數(shù)據(jù)模型最好表示為相互引用的表的集合。這就像試圖用飛機(jī)去買(mǎi)牛奶一樣。NoSQL數(shù)據(jù)庫(kù)不是SQL的替代品,但它們是替代品。

市場(chǎng)是否為NoSQL做好準(zhǔn)備?

回答這個(gè)問(wèn)題的關(guān)鍵點(diǎn)是更接近開(kāi)發(fā)人員實(shí)現(xiàn)的經(jīng)驗(yàn)。大多數(shù)數(shù)據(jù)庫(kù)程序員都接受了一年的培訓(xùn),以便相關(guān)地思考數(shù)據(jù)。他們?nèi)绾卧谶@么短的時(shí)間內(nèi)改變思維方式?它并不容易,特別是當(dāng)開(kāi)發(fā)人員必須在許多項(xiàng)目中工作時(shí),其中一些是SQL和其他NoSQL。將SQL上的相同模式復(fù)制到NoSQL系統(tǒng)的誘惑很難被擊敗,并且經(jīng)常會(huì)導(dǎo)致糟糕的結(jié)果。

實(shí)際上,有更多的SQL專有技術(shù),RDBMS上的開(kāi)發(fā)人員比NoSQL更多。同時(shí),DBA花費(fèi)大部分時(shí)間專注于關(guān)系數(shù)據(jù)庫(kù),我們不能指望在不到十年前出生的技術(shù)上找到相同的東西。在學(xué)校和大學(xué)都達(dá)到了SQL,NoSQL正在開(kāi)始。

在第一點(diǎn)之后,第二點(diǎn)是,因?yàn)檫@些系統(tǒng)較新,開(kāi)發(fā)工具較少,或者它們不像其他系統(tǒng)那么先進(jìn),但我確信這不是一個(gè)真正的問(wèn)題。有一些“企業(yè)就緒”的解決方案,它提供了管理所有基本需求的工具,我們希望這些工具隨著平臺(tái)的發(fā)展而增長(zhǎng)。

什么是最好的解決方案?

沒(méi)有涵蓋任何案例的最佳解決方案。答案很簡(jiǎn)單,但仍然相同:“這取決于”。通過(guò)本文,我希望能夠概述這些系統(tǒng)的所有功能以及了解它們何時(shí)有用的一些基礎(chǔ)知識(shí)。 

 

 

責(zé)任編輯:龐桂玉 來(lái)源: 今日頭條
相關(guān)推薦

2011-03-15 14:54:08

NoSQL

2018-09-10 13:47:21

數(shù)據(jù)科學(xué)統(tǒng)計(jì)學(xué)決策

2024-02-02 10:51:53

2015-03-17 09:24:15

NoSQL數(shù)據(jù)庫(kù)使用NoSQL

2011-02-16 16:13:40

Debian

2011-07-07 09:11:54

NoSQL數(shù)據(jù)庫(kù)

2021-09-28 09:25:05

NoSQL數(shù)據(jù)庫(kù)列式數(shù)據(jù)庫(kù)

2011-10-09 09:38:03

OracleNoSQL

2020-12-17 17:33:47

MLOps大數(shù)據(jù)數(shù)據(jù)

2015-06-04 10:26:50

2023-09-05 10:25:35

數(shù)據(jù)庫(kù)性能

2011-07-19 09:08:50

JavaNoSQL

2019-03-20 15:59:11

NoSQLRedis數(shù)據(jù)庫(kù)

2019-07-08 10:36:34

數(shù)據(jù)庫(kù)WebNoSQL

2010-04-01 09:45:38

NoSQL

2019-05-27 15:30:44

Node.jsJavaScript前端

2015-09-29 09:47:14

2015-08-26 09:54:19

物聯(lián)網(wǎng)

2024-03-28 09:00:00

NoSQL數(shù)據(jù)庫(kù)

2011-08-04 13:24:28

IT運(yùn)維
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)