自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL和NoSQL數(shù)據(jù)庫的全面比較

譯文
數(shù)據(jù)庫 SQL Server
本文為您全面比較了SQL與NoSQL數(shù)據(jù)庫的優(yōu)缺點(diǎn),并最終給出了如何選擇的建議。

眾所周知,被軟件開發(fā)界經(jīng)常使用到的數(shù)據(jù)庫主要分為兩種類型:SQL和NoSQL。兩者到底孰優(yōu)孰劣,我們又該在何種應(yīng)用場景下使用呢?本文將和您對此進(jìn)行深入探討。

類型定義

SQL,即結(jié)構(gòu)化查詢語言,是傳統(tǒng)的關(guān)系型數(shù)據(jù)庫的查詢語言。SQL數(shù)據(jù)庫能夠通過簡化CRUD操作,處理數(shù)據(jù)庫中的結(jié)構(gòu)化數(shù)據(jù)。此處的CRUD代表了創(chuàng)建(create)、檢索(或讀取,retrieve、read)、更新(update)和刪除(delete),四種控制數(shù)據(jù)的主要操作。

SQL數(shù)據(jù)庫通常被稱為關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。由于此類系統(tǒng)主要利用基于行的數(shù)據(jù)庫結(jié)構(gòu),連接各個(gè)數(shù)據(jù)表之間的相關(guān)數(shù)據(jù)對象,因此傳統(tǒng)的RDBMS使用的是SQL語法。我們熟悉的Microsoft Access、MySQL、Microsoft SQL Server、SQLite、Oracle Database、IBM DB2、以及Backendless等都是RDBMS類型的SQL數(shù)據(jù)庫。

而NoSQL數(shù)據(jù)庫并沒有任何固定用于保存數(shù)據(jù)的結(jié)構(gòu)化數(shù)據(jù)表。從技術(shù)上講,所有非關(guān)系型數(shù)據(jù)庫都可以被稱為NoSQL數(shù)據(jù)庫。不同于關(guān)系型數(shù)據(jù)庫,NoSQL數(shù)據(jù)庫不但可以被快速地設(shè)置,并且只需最少量的預(yù)先規(guī)劃(pre-planning)。常見的NoSQL數(shù)據(jù)庫示例包括:MongoDB、DynamoDB、SimpleDB、CouchDB、CouchBase、OrientDB、InfiniteGraph、Neo4j、FlockDB、Cassandra、以及HBase等。

截至2021年5月,在DB-Engines上??排名??前六的數(shù)據(jù)庫系統(tǒng)中,有五個(gè)是關(guān)系型數(shù)據(jù)庫。其中前四名分別是Oracle、MySQL、Microsoft SQL Server和PostgreSQL。

下面,讓我們來深入探討SQL和NoSQL數(shù)據(jù)庫的各種優(yōu)缺點(diǎn):

SQL的優(yōu)勢

從廣義上說,SQL數(shù)據(jù)庫需要對關(guān)系模型進(jìn)行更高級的準(zhǔn)備和規(guī)劃。不過,其好處是您的數(shù)據(jù)將能夠保持一致與整潔。通常,關(guān)系模型表示了數(shù)據(jù)在數(shù)據(jù)庫中的存儲方式,例如:每個(gè)數(shù)據(jù)表的結(jié)構(gòu)、以及與其他表的關(guān)聯(lián)方式。

  • 標(biāo)準(zhǔn)化模式

盡管具有標(biāo)準(zhǔn)化模式的SQL數(shù)據(jù)庫、以及關(guān)系型數(shù)據(jù)庫,通常被認(rèn)為“死板”且難以被修改,但是它們有著更多的規(guī)范優(yōu)勢。例如,添加到數(shù)據(jù)庫的每個(gè)數(shù)據(jù)對象,都必須符合各種鏈接表(包括行和列)的公認(rèn)架構(gòu)。顯然,這對于數(shù)據(jù)的合規(guī)性、完整性、一致性、以及安全性,都是至關(guān)重要的。

  • 大量的用戶群

由于SQL是一種成熟且應(yīng)用廣泛的編程語言,因此擁有著各種龐大的用戶社區(qū),其中不乏許多擁有豐富經(jīng)驗(yàn)的專家。由他們提供的強(qiáng)大的SQL知識,可以為應(yīng)用程序的開發(fā)人員提供大量的咨詢、協(xié)作、以及提高技能的機(jī)會(huì)。

  • ACID的合規(guī)性

由于關(guān)系型數(shù)據(jù)庫的數(shù)據(jù)表結(jié)構(gòu)比較精確,因此SQL數(shù)據(jù)庫具有ACID(請見下面的詳述)的特點(diǎn),能夠有助于確保數(shù)據(jù)表的同步、以及事務(wù)的有效性。也就是說,因?yàn)镾QL數(shù)據(jù)庫可以提供較高數(shù)據(jù)完整性級別,所以它往往是運(yùn)行應(yīng)用程序的優(yōu)先選擇。

  1. 原子性(Atomicity):所有數(shù)據(jù)和事務(wù)的更改都是被完全作為單個(gè)操作執(zhí)行的。如果失敗,數(shù)據(jù)庫則不會(huì)執(zhí)行任何更改。
  2. 一致性(Consistency):數(shù)據(jù)在事務(wù)開始和完成時(shí)須保持一致且有效。
  3. 隔離性(Isolation):事務(wù)能夠同步運(yùn)行,且不產(chǎn)生任何競爭或沖突。它們能夠表現(xiàn)得好像是連續(xù)發(fā)生的那樣。
  4. 持久性(Durability):一旦事務(wù)完成,其數(shù)據(jù)結(jié)果應(yīng)當(dāng)是永久的,且不能被更改的。

比如說,對于一個(gè)庫存管理系統(tǒng),最重要的是一旦物品被購買掉,就應(yīng)當(dāng)從庫存中被移除,以防止產(chǎn)生庫存與實(shí)際產(chǎn)品數(shù)量不符的問題。也就是說,在客戶下訂單時(shí),系統(tǒng)應(yīng)及時(shí)更新庫存、創(chuàng)建新的發(fā)貨數(shù)據(jù)對象、更新付款信息、以及更新客戶信息等。所有與此相關(guān)的數(shù)據(jù)表,都會(huì)得到同步和更新,以完成規(guī)定的事務(wù)。

  • 幾乎不需要代碼

SQL是一種對開發(fā)人員非常友好的語言。他們使用簡單的英語,就可以輕松地學(xué)會(huì)管理和查詢各種關(guān)系型數(shù)據(jù)庫。而且他們需要使用的只是簡單的關(guān)鍵字,而無需編寫代碼。

例如,Backendless數(shù)據(jù)庫的查詢就可以用SQL來編寫。此外,SQL的相關(guān)術(shù)語還可以用于制作精確的API調(diào)用,以實(shí)現(xiàn)數(shù)據(jù)的訪問和修改。即使是沒有任何SQL查詢編寫背景的用戶,也可以使用??Database Views??,直觀地創(chuàng)建各種查詢。

SQL的缺點(diǎn)

  • 硬件

SQL數(shù)據(jù)庫只適合垂直方向的擴(kuò)展。這意味著,您只能通過在現(xiàn)有的服務(wù)器上,增加諸如CPU、SSD和RAM之類的部件,或購買更快、更昂貴的服務(wù)器,以實(shí)現(xiàn)擴(kuò)容。隨著業(yè)務(wù)數(shù)據(jù)的不斷增長,您會(huì)被持續(xù)要求增加硬盤空間,以及具有更優(yōu)性能的主機(jī),來承載更新、更先進(jìn)的技術(shù)。正因?yàn)槿绱耍伤a(chǎn)生的硬件淘汰率也會(huì)更高。

現(xiàn)代化SQL數(shù)據(jù)庫往往會(huì)用到分片(sharding)的過程。分片技術(shù)可以在具有相同模式的多個(gè)數(shù)據(jù)表中,通過分離或分區(qū)數(shù)據(jù),來實(shí)現(xiàn)水平擴(kuò)展。例如,開發(fā)人員無需在同一個(gè)數(shù)據(jù)表中存儲100,000個(gè)對象,而只要?jiǎng)?chuàng)建兩個(gè)具有相同模式的數(shù)據(jù)表,并保證每個(gè)表都存儲50,000個(gè)對象即可。而且兩張表之間沒有重復(fù)性。

當(dāng)然,使用諸如Backendless之類的??無服務(wù)器托管服務(wù)??,也可以緩解擴(kuò)展性的問題。該數(shù)據(jù)系統(tǒng)可以為您管理自動(dòng)化的擴(kuò)展,既省去了物理服務(wù)器的管理,又實(shí)現(xiàn)了大規(guī)模的數(shù)據(jù)庫效能。

  • 過于死板

SQL數(shù)據(jù)庫的傳統(tǒng)關(guān)系模型或模式,必須在使用之前被事先定義好。而且一旦完成了定義,也就喪失了部分靈活性。即:任何調(diào)整都可能會(huì)成為資源密集型的負(fù)擔(dān)。因此,開發(fā)者在將數(shù)據(jù)庫投入生產(chǎn)環(huán)境之前,必須在規(guī)劃設(shè)計(jì)上投入大量的時(shí)間。

當(dāng)然,Backendless可以讓開發(fā)人員即便是在應(yīng)用程序啟動(dòng)之后,也可以隨時(shí)修改架構(gòu),添加新的數(shù)據(jù)表和列,以及建立關(guān)系等,相較傳統(tǒng)SQL數(shù)據(jù)庫,具有更大的靈活性。因此,Backendless系統(tǒng)非常適合早期的產(chǎn)品開發(fā),畢竟開發(fā)過程的初期不會(huì)被鎖定在某一固定的模式中。

  • 數(shù)據(jù)規(guī)范化

開發(fā)關(guān)系型數(shù)據(jù)庫的一項(xiàng)目標(biāo)便是消除數(shù)據(jù)的重復(fù)。每張數(shù)據(jù)表都具有不同的信息。這些信息可以通過一些常用的值(如序列號)進(jìn)行查詢和連接。不過,當(dāng)SQL數(shù)據(jù)庫的變化過于頻繁時(shí),在多張數(shù)據(jù)表之間進(jìn)行連接和查詢,一旦碰到單個(gè)查詢所需的數(shù)據(jù)表過多的情況,系統(tǒng)的速度要么會(huì)被拖慢,要么需要大量調(diào)用相應(yīng)的處理能力。

  • 傳統(tǒng)的資源密集型升級和擴(kuò)展

如前所述,SQL數(shù)據(jù)庫的縱向擴(kuò)展能力需要通過擴(kuò)大硬件投資來實(shí)現(xiàn)。顯然,此舉不但費(fèi)錢而且費(fèi)時(shí),因此一些組織會(huì)試圖讓開發(fā)人員通過編程的方式,實(shí)現(xiàn)分區(qū)和水平擴(kuò)展。例如,Backendless會(huì)以基礎(chǔ)架構(gòu)即服務(wù)(IaaS)的形式,為您自動(dòng)管理擴(kuò)展的過程,處理服務(wù)器的維護(hù),以及資源的分配等艱巨任務(wù),以便用戶專注于構(gòu)建出色的產(chǎn)品,而非數(shù)據(jù)庫的增長。

NoSQL的優(yōu)勢

  • 查詢速度

由于NoSQL查詢是非規(guī)范化的,而特定查詢所需的所有信息通常會(huì)被存儲在一起,因此開發(fā)者能夠?qū)φ谔幚淼拇罅繑?shù)據(jù)進(jìn)行輕松地查詢,無需擔(dān)心出現(xiàn)重復(fù)的數(shù)據(jù)。同時(shí),NoSQL對于簡單查詢的響應(yīng)也非??臁?/p>

  • 持續(xù)可用性

對于NoSQL數(shù)據(jù)庫而言,由于數(shù)據(jù)分布在不同的區(qū)域和多個(gè)服務(wù)器上,因此,NoSQL數(shù)據(jù)庫不但消除了單點(diǎn)故障,減少了停機(jī)時(shí)間,而且更具有擴(kuò)展性、穩(wěn)定性、以及持續(xù)可用性。

  • 敏捷

NoSQL數(shù)據(jù)庫通過為開發(fā)人員提供了足夠的靈活性,以協(xié)助提高他們的生產(chǎn)力和創(chuàng)造力。它們不但不會(huì)受到行和列的約束,并且其模式也不需要預(yù)先定義。此外,由于NoSQL數(shù)據(jù)庫是動(dòng)態(tài)的,因此它可以處理包括:多態(tài)化、半結(jié)構(gòu)化、結(jié)構(gòu)化、以及非結(jié)構(gòu)化等各種類型的數(shù)據(jù)。

應(yīng)用程序開發(fā)人員可以直接構(gòu)建并開始使用NoSQL數(shù)據(jù)庫,而無需花費(fèi)精力和時(shí)間去進(jìn)行前期規(guī)劃。當(dāng)需求發(fā)生變化、或需要添加新的數(shù)據(jù)類型時(shí),它能夠按需修改,以滿足不同數(shù)據(jù)類型和不斷變化的功能需求。

  • 低成本擴(kuò)展

NoSQL數(shù)據(jù)庫的水平擴(kuò)展能力具有一定的成本效益。與昂貴的硬件升級不同,此類數(shù)據(jù)庫可以通過簡單地添加云實(shí)例、或虛擬服務(wù)器,來實(shí)現(xiàn)低成本的擴(kuò)展。此外,許多開源的NoSQL數(shù)據(jù)庫也為軟件開發(fā)公司提供了廉價(jià)的數(shù)據(jù)庫選擇。

NoSQL的缺點(diǎn)

  • 沒有標(biāo)準(zhǔn)化的語言

由于沒有統(tǒng)一的用于執(zhí)行NoSQL查詢的固定語言,因此我們在查詢不同的NoSQL數(shù)據(jù)庫類型的數(shù)據(jù)時(shí),所使用的語法會(huì)有所不同。這就導(dǎo)致了與只需學(xué)習(xí)一種SQL語言相比,NoSQL的學(xué)習(xí)曲線會(huì)更加陡峭。此外,由于出現(xiàn)得較晚,開發(fā)團(tuán)隊(duì)內(nèi)可能缺乏研發(fā)與實(shí)施NoSQL系統(tǒng)的、有經(jīng)驗(yàn)的人員,因此團(tuán)隊(duì)需要增加在培訓(xùn)或引進(jìn)人才方面的成本。

  • 執(zhí)行復(fù)雜查詢的效率低下

如果NoSQL數(shù)據(jù)庫中存在著豐富的數(shù)據(jù)結(jié)構(gòu),那么會(huì)因?yàn)槿狈蓤?zhí)行復(fù)雜查詢的標(biāo)準(zhǔn)接口,而導(dǎo)致查詢效率的低下。而且,由于數(shù)據(jù)結(jié)構(gòu)的原因,就算執(zhí)行簡單的NoSQL查詢,也可能需要一定的編程技巧。顯然,這對于倡導(dǎo)無代碼化的開發(fā)人員而言,會(huì)是一種挑戰(zhàn)。

  • 專家數(shù)量有待增加

不可否認(rèn),已有越來越多開發(fā)人員愿意使用NoSQL數(shù)據(jù)庫,并且在不斷地壯大著其相應(yīng)的社區(qū)。但是,相對于成熟的SQL社區(qū),該領(lǐng)域的專家和顧問可能需要更多的時(shí)間,去解決那些未曾被記錄的NoSQL問題。

  • 數(shù)據(jù)檢索不一致

由于NoSQL數(shù)據(jù)庫是分布式的,數(shù)據(jù)在被快速獲得的同時(shí),其查詢結(jié)果可能不會(huì)返回的是最新、最準(zhǔn)確的數(shù)據(jù)信息。畢竟分布式方法會(huì)使得數(shù)據(jù)庫,根據(jù)查詢服務(wù)器的不同,而持續(xù)返回不同的數(shù)據(jù)值。

相對于前面提到的ACID級別,許多NoSQL數(shù)據(jù)庫更符合BASE標(biāo)準(zhǔn)(譯者注:是基本可用--Basically Available、軟狀態(tài)--Soft state和最終一致性--Eventually consistent,三個(gè)短語的簡寫)。顯然,NoSQL更重視的是可用性與速度??梢哉f,數(shù)據(jù)檢索的不一致性,是NoSQL數(shù)據(jù)庫的主要缺點(diǎn)之一。

小結(jié)

綜上所述,SQL和NoSQL數(shù)據(jù)庫都有著各自的適用場景,并能滿足特定的數(shù)據(jù)需求與應(yīng)用目標(biāo)。您可以根據(jù)自己手頭項(xiàng)目的實(shí)際特點(diǎn),權(quán)衡兩者的利弊,做出合適的選擇。當(dāng)然,您的選擇也不一定是排他的。您完全可以將兩者結(jié)合起來使用,讓每種數(shù)據(jù)庫類型都能夠發(fā)揮各自的優(yōu)勢。事實(shí)上,許多公司在其云端架構(gòu)中、甚至是在同一個(gè)應(yīng)用程序中,正在同時(shí)使用這兩種類型的數(shù)據(jù)庫。

譯者介紹

陳 峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項(xiàng)目實(shí)施經(jīng)驗(yàn),善于對內(nèi)外部資源與風(fēng)險(xiǎn)實(shí)施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗(yàn);持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開展信息安全類培訓(xùn)與授課。

原文標(biāo)題:SQL vs NoSQL Database – A Complete Comparison,作者:Chris Fanchi

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2015-07-06 14:23:54

NoSQLSQL非關(guān)系型數(shù)據(jù)存儲

2024-04-02 00:00:00

SQL數(shù)據(jù)庫數(shù)據(jù)

2011-07-06 16:36:40

Redis

2024-02-02 10:51:53

2011-10-11 17:07:12

數(shù)據(jù)庫Internet文件數(shù)據(jù)庫

2021-01-28 09:00:00

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

2021-09-28 09:25:05

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

2009-07-06 08:36:28

NoSQL關(guān)系數(shù)據(jù)庫

2011-10-09 09:38:03

OracleNoSQL

2022-06-27 17:01:34

NoSQ數(shù)據(jù)庫SQL

2020-10-31 22:01:40

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

2017-05-25 10:11:46

數(shù)據(jù)庫令牌節(jié)點(diǎn)

2011-08-02 16:27:50

SQLNoSQL

2010-07-08 11:05:14

SQL Server數(shù)

2018-03-02 09:00:00

數(shù)據(jù)庫NoSQLSQL

2019-06-11 12:23:28

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

2010-07-19 17:26:55

SQL Server

2019-07-08 10:36:34

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

2019-03-20 15:59:11

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

2011-07-19 09:08:50

JavaNoSQL
點(diǎn)贊
收藏

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