《全面梳理SQL和NoSQL數(shù)據(jù)庫的技術(shù)差別》要點:
本文介紹了全面梳理SQL和NoSQL數(shù)據(jù)庫的技術(shù)差別,希望對您有用。如果有疑問,可以聯(lián)系我們。
創(chuàng)新的背后往往會刺激痛苦.這一點在PDD(我們親切地稱為痛處驅(qū)動開發(fā))軟件開發(fā)領(lǐng)域尤為真實.從上世紀80年代以來,我們就都知道如何處理關(guān)系型數(shù)據(jù)——只要把數(shù)據(jù)放到關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)中,就可以使用SQL語句操作數(shù)據(jù).然而,在過去幾年來,我們的行業(yè)采用NoSQL數(shù)據(jù)庫的趨勢在增長,數(shù)據(jù)不見得都在關(guān)系型數(shù)據(jù)庫中存儲了.
誠然,在互聯(lián)網(wǎng)上有成千上萬關(guān)于選擇SQL還是NoSQL的辯論.但是,這兩者是不是必須站在對立面戰(zhàn)斗呢?如果你選擇一種或另一種,你知道為什么做選擇,知道各自有何潛在益處嗎?本文簡要地討論了SQL和NoSQL兩種辦法最常見的優(yōu)點和缺點,包括簡單的比較和開發(fā)者考慮的因素.像別的一些話題一樣,這個問題沒有對錯,永遠正確的經(jīng)典答案依然是:具體問題具體分析.
數(shù)據(jù)表VS.數(shù)據(jù)集
關(guān)系型和非關(guān)系型數(shù)據(jù)庫的主要差異是數(shù)據(jù)存儲的方式.關(guān)系型數(shù)據(jù)天然便是表格式的,因此存儲在數(shù)據(jù)表的行和列中.數(shù)據(jù)表可以彼此關(guān)聯(lián)協(xié)作存儲,也很容易提取數(shù)據(jù).與其相反,非關(guān)系型數(shù)據(jù)不適合存儲在數(shù)據(jù)表的行和列中,而是大塊組合在一起.非關(guān)系型數(shù)據(jù)通常存儲在數(shù)據(jù)集中,就像文檔、鍵值對或者圖結(jié)構(gòu).你的數(shù)據(jù)及其特性是選擇數(shù)據(jù)存儲和提取方式的首要影響因素.
預(yù)定義布局VS.動態(tài)布局
關(guān)系型數(shù)據(jù)通常對應(yīng)于結(jié)構(gòu)化數(shù)據(jù),因為數(shù)據(jù)表都有預(yù)定義好的結(jié)構(gòu)(列的定義),結(jié)構(gòu)描述了數(shù)據(jù)的形式和內(nèi)容.這一點對數(shù)據(jù)建模至關(guān)重要,你必須“第一時間先把結(jié)構(gòu)定義好”.雖然預(yù)定義結(jié)構(gòu)帶來了可靠性和穩(wěn)定性,但是已經(jīng)存入數(shù)據(jù)的表結(jié)構(gòu)要修改就非常痛苦了.另一方面,非關(guān)系型數(shù)據(jù)基于動態(tài)結(jié)構(gòu),通常適用于非結(jié)構(gòu)化數(shù)據(jù).非關(guān)系型數(shù)據(jù)可以很容易適應(yīng)數(shù)據(jù)類型和結(jié)構(gòu)的變化,因為動態(tài)結(jié)構(gòu)自己就支持這一點.
存儲規(guī)范化VS存儲代價
關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)存儲是為了更高的規(guī)范性,把數(shù)據(jù)分隔成最小的邏輯表(關(guān)系表)以避免重復(fù),獲得最精簡的空間利用.雖然數(shù)據(jù)規(guī)范性會使數(shù)據(jù)管理更清晰,但它通常也會帶來一點點復(fù)雜性,尤其是單個操作可能涉及多個關(guān)系表的時候,數(shù)據(jù)管理就有點麻煩.另外,更精簡的空間利用通常可以節(jié)約名貴的數(shù)據(jù)存儲,但是在當今世界我們基本可以認為存儲的代價(磁盤空間)是微不足道的.而非關(guān)系型數(shù)據(jù)存儲在平面數(shù)據(jù)集中,數(shù)據(jù)經(jīng)常可能存在重復(fù).單個數(shù)據(jù)庫很少被分隔開,而是存儲成一個整體,這樣是為了整塊數(shù)據(jù)更容易讀寫.
縱向擴容VS橫向擴容
SQL和NoSQL數(shù)據(jù)庫最大的差別可能是在擴展方式上,要支持日益增長的需求當然要擴展.要支持更多并發(fā)量,SQL數(shù)據(jù)庫是縱向擴展,也就是說提高處理能力,使用速度更快速的計算機,這樣處理相同的數(shù)據(jù)集就更快了.因為數(shù)據(jù)存儲在關(guān)系表中,操作的性能瓶頸可能涉及很多個表,這都必要通過提高計算機性能來客服.雖然SQL數(shù)據(jù)庫有很大擴展空間,但最終肯定會達到縱向擴展的上限.而NoSQL數(shù)據(jù)庫是橫向擴展的.非關(guān)系型數(shù)據(jù)存儲天然就是分布式的,NoSQL數(shù)據(jù)庫的擴展可以通過給資源池添加更多普通的數(shù)據(jù)庫服務(wù)器(節(jié)點)來分擔負載.
布局化查詢VS非布局化查詢
關(guān)系型數(shù)據(jù)庫通過所謂結(jié)構(gòu)化查詢語言(也就是我們常說的SQL)來操作數(shù)據(jù).SQL支持數(shù)據(jù)庫CRUD(增加,查詢,更新,刪除)操作的功能非常強大,是業(yè)界標準用法.非關(guān)系型數(shù)據(jù)庫以塊(像文檔一樣)為單元把持數(shù)據(jù),使用所謂的非結(jié)構(gòu)化查詢語言(UnQL),它是沒有標準的,因數(shù)據(jù)庫提供商的不同而不同.關(guān)系型表中主鍵的概念對應(yīng)非關(guān)系存儲中的文檔Id.SQL數(shù)據(jù)庫使用預(yù)定義優(yōu)化方式(比如列索引定義)幫助加速查詢操作,而NoSQL數(shù)據(jù)庫采用更簡單而精確的數(shù)據(jù)訪問模式.
映射VS當?shù)鼗?/b>
SQL和NoSQL數(shù)據(jù)存儲的選擇還取決于開發(fā)人員,盡管這個因素影響不大.采用面向?qū)ο缶幊陶Z言的開發(fā)人員通常會同時操作一個或多個數(shù)據(jù)實體(包括嵌套數(shù)據(jù)、列表和數(shù)組的復(fù)雜結(jié)構(gòu)),把數(shù)據(jù)傳遞給應(yīng)用程序用戶界面.要是討論到底層數(shù)據(jù)庫,事情就并不總是那么公平合理了.在關(guān)系型存儲中,數(shù)據(jù)實體通常需要分成多個部分進行規(guī)范化,然后分開存儲到多個關(guān)系型表中精簡存儲.幸運的是,這是一個長期存在的問題,大部分編程平臺都有相應(yīng)的簡單辦理方案,比如ORM層(對象關(guān)系映射).ORM是位于關(guān)系型數(shù)據(jù)源和開發(fā)者使用的面向?qū)ο髷?shù)據(jù)實體之間的一個映射層.然而,對于非關(guān)系型存儲,不需要規(guī)范化數(shù)據(jù),復(fù)雜數(shù)據(jù)實體可以整體存放在獨立單元中.應(yīng)用程序中使用的對象通常序列化為JSon串,存儲在NoSQL數(shù)據(jù)庫的JSon文檔中.
事務(wù)性VS純擴展性
如果你的數(shù)據(jù)操作必要高事務(wù)性或者復(fù)雜數(shù)據(jù)查詢必要控制執(zhí)行計劃,那么傳統(tǒng)的SQL數(shù)據(jù)庫從性能和穩(wěn)定性方面考慮是你的最佳選擇.SQL數(shù)據(jù)庫支持對事務(wù)原子性細粒度控制,并且易于回滾事務(wù).雖然NoSQL數(shù)據(jù)庫也可以使用事務(wù)操作,但它們真正閃亮的價值是在操作的擴展性和大數(shù)據(jù)量處理方面.
ACID VS CAP
SQL 數(shù)據(jù)庫久負盛名的價值就是通過所謂的ACID屬性(原子性,一致性,隔離性,持久性)保證數(shù)據(jù)完整性,大部分關(guān)系型存儲供應(yīng)商都支持ACID.我們的目標是支持隔離不可分割的事務(wù),其變化是持久的,數(shù)據(jù)也堅持一致狀態(tài).而NoSQL數(shù)據(jù)庫是讓你在CAP(一致性,可用性,分區(qū)容忍度)中的任意兩項中選擇,因為在基于節(jié)點的分布式系統(tǒng)中,很難做到三項都滿足.
數(shù)據(jù)VS大數(shù)據(jù)
SQL數(shù)據(jù)庫可以可靠地存儲和處理數(shù)據(jù),而NoSQL最大的優(yōu)勢是在應(yīng)對大數(shù)據(jù)方面,也便是由我們社會或者計算機每天產(chǎn)生的大量非結(jié)構(gòu)化的數(shù)據(jù)實體.NoSQL用無模式方式做數(shù)據(jù)管理,所以其橫向擴展?jié)摿κ菬o限的,這可能是深度處理大數(shù)據(jù)捕獲、管理、檢索、分析和可視化的唯一有效途徑.
數(shù)據(jù)記錄VS物聯(lián)網(wǎng)和人聯(lián)網(wǎng)
關(guān)系數(shù)據(jù)庫在關(guān)注數(shù)據(jù)規(guī)范化和保證性能的基礎(chǔ)上精簡存儲.但是近年來,我們產(chǎn)生數(shù)據(jù)的速度遠大于關(guān)系型存儲能滿足存儲的能力增長.刺激數(shù)據(jù)如此迅猛增長的原因是:巨大量的用戶數(shù)和物聯(lián)網(wǎng).連接到互聯(lián)網(wǎng)的用戶在成倍增加,在同步使用我們的應(yīng)用.由于大量移動設(shè)備數(shù)據(jù)傳感設(shè)備接入互聯(lián)網(wǎng),機器產(chǎn)生的數(shù)據(jù)量也大幅增加.因此企業(yè)必需尋求NoSQL技術(shù)及基礎(chǔ)架構(gòu)來處理持續(xù)涌入的半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù).
內(nèi)部部署VS云計算
云計算現(xiàn)在已經(jīng)無處不在了,它兼具SQL和NoSQL數(shù)據(jù)庫的益處.云環(huán)境中的關(guān)系型存儲通常是以服務(wù)形式提供的,是可復(fù)制、高可用性且分布式的,極大地提高了橫向擴展能力.托管于云服務(wù)中的NoSQL數(shù)據(jù)庫也天然享有自動分片的好處,可以階段性地靈活彈性處理,集成高速緩存和巨大的計算能力來捕捉、存儲和分析大數(shù)據(jù).
付費VS開源
有一種看法認為,SQL數(shù)據(jù)庫大多數(shù)比擬昂貴,而NoSQL數(shù)據(jù)庫通常都是開源的.事實上,兩種類型數(shù)據(jù)庫都有開源的和商業(yè)的.常見的SQL 數(shù)據(jù)庫有微軟公司的SQL Server,MySQL,SQLite,Oracle和PostGres.流行的NoSQL數(shù)據(jù)庫有Couchbase,MongoDB,Redis,BigTable和RavenDB.
結(jié)論
就像Neo之于Matrix,你可以選擇.幸福的無知和幻想或者接受殘酷的現(xiàn)實.但是,盲目選擇使用SQL還是NoSQL技術(shù),或者根據(jù)大眾需求選擇都是在幻想有魔法會自動選擇合適的方案.SQL和NoSQL這兩者都有各自的優(yōu)缺點,選擇正確的架構(gòu)取決于你構(gòu)建應(yīng)用的需求.傳統(tǒng)SQL數(shù)據(jù)庫依然非常強大,可以可靠地處理你的事務(wù)性需求并堅持完整性.只有在你接近關(guān)系數(shù)據(jù)庫局限性邊緣時,或者你的數(shù)據(jù)處理量浩如煙海時,操作擴展需要更加分布式的系統(tǒng)時,才考慮NoSQL方案.考慮這些因素之后再做選擇,你就可以變成釋放你的數(shù)據(jù)構(gòu)建下一代應(yīng)用令人嘆為觀止的神人.
更多精彩內(nèi)容,請關(guān)注互聯(lián)網(wǎng)闡發(fā)沙龍微信:techxue 每天為您推送最新、最熱干貨!
《全面梳理SQL和NoSQL數(shù)據(jù)庫的技術(shù)差別》是否對您有啟發(fā),歡迎查看更多與《全面梳理SQL和NoSQL數(shù)據(jù)庫的技術(shù)差別》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/10136.html