你應(yīng)該使用NoSQL數(shù)據(jù)庫(kù)、SQL數(shù)據(jù)庫(kù)還是兩者都用?
譯文【51CTO.com快譯】SQL和NoSQL之爭(zhēng)只不過(guò)是關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)的比較。區(qū)別在于它們是如何構(gòu)建的、存儲(chǔ)信息的種類(lèi)以及如何存儲(chǔ)信息。關(guān)系數(shù)據(jù)庫(kù)是結(jié)構(gòu)化的,非關(guān)系數(shù)據(jù)庫(kù)是面向文檔、分布式的。四十多年來(lái),結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL)數(shù)據(jù)庫(kù)一直是主要的數(shù)據(jù)存儲(chǔ)機(jī)制。
隨著Web應(yīng)用程序以及PostgreSQL、MySQL和SQLite等開(kāi)源技術(shù)日益盛行,使用率在上世紀(jì)90年代末急劇提高。盡管NoSQL數(shù)據(jù)庫(kù)自上世紀(jì)60年代以來(lái)就已存在,但最近開(kāi)始受到追捧,比如MongoDB、CouchDB、Redis和Apache Cassandra等流行的選擇方案。說(shuō)到底,SQL和NoSQL都做同樣的事情:存儲(chǔ)數(shù)據(jù),只不過(guò)方法不一樣。盡管NoSQL日益流行,卻不是取代SQL的技術(shù),而是另一種選擇。一些項(xiàng)目更適合使用SQL數(shù)據(jù)庫(kù),而其他項(xiàng)目適用于NoSQL。一些項(xiàng)目可以換著使用兩者。
1.SQL
結(jié)構(gòu)化查詢(xún)語(yǔ)言(SQL)是存儲(chǔ)數(shù)據(jù)的更結(jié)構(gòu)化、更僵硬的方式,就像電話(huà)簿那樣。關(guān)系數(shù)據(jù)庫(kù)要高效,你得以一種非常條理化的方式來(lái)存儲(chǔ)數(shù)據(jù)。SQL數(shù)據(jù)庫(kù)仍很流行,因?yàn)樗鼈兲焐m用于許多古老的軟件堆棧,包括LAMP和基于Ruby的堆棧。這些數(shù)據(jù)庫(kù)得到了廣泛的支持,并得到了充分的理解;如果你遇到問(wèn)題,這可能是一大有利條件。
說(shuō)到數(shù)據(jù)庫(kù)技術(shù),不存在一應(yīng)俱全式的解決方案。這就是為什么大多數(shù)公司同時(shí)依賴(lài)非關(guān)系數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)來(lái)完成不同的任務(wù)。不過(guò)在許多情況下,盡管NoSQL數(shù)據(jù)庫(kù)憑借速度和可擴(kuò)展性越來(lái)越受歡迎,但高度結(jié)構(gòu)化的SQL數(shù)據(jù)庫(kù)更受喜愛(ài)。
優(yōu)點(diǎn):
- ACID(原子性、一致性、隔離性和持久性)合規(guī)性準(zhǔn)確地表明事務(wù)如何與數(shù)據(jù)庫(kù)交互,以此減少異常情況,并保護(hù)數(shù)據(jù)庫(kù)的完整性。NoSQL數(shù)據(jù)庫(kù)常常具有處理速度快、靈活的優(yōu)點(diǎn),但犧牲了ACID合規(guī)性。
- 你的數(shù)據(jù)保持不變、結(jié)構(gòu)化。如果貴公司沒(méi)有迎來(lái)大規(guī)模發(fā)展(那需要更多的服務(wù)器),而且只處理一致的數(shù)據(jù),那么恐怕沒(méi)有理由使用旨在支持高流量和眾多數(shù)據(jù)類(lèi)型的系統(tǒng)。
- 由于很早就面市了,這些工具隨帶更好的支持、產(chǎn)品套件和附件以管理這些數(shù)據(jù)庫(kù)。
缺點(diǎn):
- SQL的主要問(wèn)題是隨著數(shù)據(jù)庫(kù)變大而進(jìn)行擴(kuò)展。你發(fā)現(xiàn),即使可擴(kuò)展性通常在生產(chǎn)環(huán)境中進(jìn)行了測(cè)試,但常常不如NoSQL數(shù)據(jù)庫(kù)。分片(sharding)同樣存在相當(dāng)大的問(wèn)題。
2.NoSQL
如果貴公司在處理大量非結(jié)構(gòu)化數(shù)據(jù),你的數(shù)據(jù)要求一開(kāi)始又并不清晰,那么可能無(wú)法開(kāi)發(fā)模式(schema)明確定義的關(guān)系數(shù)據(jù)庫(kù)。使用非關(guān)系數(shù)據(jù)庫(kù)可以獲得比傳統(tǒng)數(shù)據(jù)庫(kù)高得多的靈活性。不妨把非關(guān)系型數(shù)據(jù)庫(kù)想象成檔案夾,整理各種類(lèi)型的相關(guān)信息。
優(yōu)點(diǎn):
- 推動(dòng)NoSQL發(fā)展的重大因素是大數(shù)據(jù),促使CouchDB、MongoDB、Cassandra和HBase之類(lèi)的NoSQL數(shù)據(jù)庫(kù)大行其道。NoSQL數(shù)據(jù)庫(kù)確保:當(dāng)服務(wù)器端應(yīng)用程序的所有其他組件都被設(shè)計(jì)成無(wú)縫、快速時(shí),數(shù)據(jù)沒(méi)有成為瓶頸。
- 你可以存儲(chǔ)大量幾乎沒(méi)有結(jié)構(gòu)的數(shù)據(jù)。此外,NoSQL數(shù)據(jù)庫(kù)對(duì)于可以一起存儲(chǔ)的數(shù)據(jù)類(lèi)型沒(méi)有限制,你的要求若有變化,可以添加更多的新類(lèi)型。若使用基于文檔的數(shù)據(jù)庫(kù),還可以將數(shù)據(jù)存儲(chǔ)在一個(gè)地方,無(wú)需事先定義數(shù)據(jù)類(lèi)型。
- 基于云的存儲(chǔ)是一種節(jié)省成本的優(yōu)秀解決方案,不過(guò)你得將數(shù)據(jù)分散在多臺(tái)服務(wù)器上來(lái)進(jìn)行擴(kuò)展。NoSQL數(shù)據(jù)庫(kù)旨在直接可以跨多個(gè)數(shù)據(jù)中心進(jìn)行擴(kuò)展,沒(méi)有太大的麻煩。
- 你不必事先準(zhǔn)備好NoSQL數(shù)據(jù)。NoSQL數(shù)據(jù)庫(kù)的非關(guān)系性質(zhì)讓你可以迅速創(chuàng)建數(shù)據(jù)庫(kù),沒(méi)必要開(kāi)發(fā)詳細(xì)的數(shù)據(jù)庫(kù)模型,因而為你節(jié)省大量的開(kāi)發(fā)時(shí)間。
缺點(diǎn):
- 由于歷史較短,NoSQL社區(qū)缺乏MySQL用戶(hù)群的成熟性。雖然眼下NoSQL社區(qū)在迅猛發(fā)展,但相比MySQL之類(lèi)的SQL數(shù)據(jù)庫(kù)管理系統(tǒng),很難與其經(jīng)驗(yàn)豐富的最終用戶(hù)組成的龐大網(wǎng)絡(luò)相競(jìng)爭(zhēng)。
- NoSQL數(shù)據(jù)庫(kù)的一大問(wèn)題是缺乏用于性能測(cè)試和分析的報(bào)告工具。另一方面,使用SQL,你能找到一大批報(bào)告工具幫助證明應(yīng)用程序的有效性。
- 你將面臨與SQL指令兼容的問(wèn)題。在查詢(xún)語(yǔ)言中,新的數(shù)據(jù)庫(kù)使用自己的特性,目前還無(wú)法與關(guān)系數(shù)據(jù)庫(kù)中使用的SQL完全兼容。
- 缺乏標(biāo)準(zhǔn)化?,F(xiàn)在有許多NoSQL數(shù)據(jù)庫(kù),卻仍然沒(méi)有標(biāo)準(zhǔn),而關(guān)系數(shù)據(jù)庫(kù)有標(biāo)準(zhǔn)。NoSQL缺乏標(biāo)準(zhǔn)化的這個(gè)現(xiàn)狀可能會(huì)在遷移過(guò)程中帶來(lái)問(wèn)題。
結(jié)論
如今,NoSQL數(shù)據(jù)庫(kù)正成為數(shù)據(jù)庫(kù)市場(chǎng)的一個(gè)重要角色。憑借諸多優(yōu)點(diǎn),它們會(huì)成為企業(yè)領(lǐng)域真正改變游戲規(guī)則的技術(shù)。對(duì)于希望整合大數(shù)據(jù)的公司而言,成本更低、更易于擴(kuò)展和開(kāi)源等特性使得NoSQL成為一種誘人的選擇。
即便如此,NoSQL還是一種比較年輕的技術(shù),沒(méi)有MySQL等SQL數(shù)據(jù)庫(kù)提供的那一套標(biāo)準(zhǔn)。一些人認(rèn)為NoSQL是未來(lái)的方向,另一些人擔(dān)心它缺乏ACID合規(guī)性和標(biāo)準(zhǔn)化。最終,貴公司復(fù)雜的業(yè)務(wù)需求以及所使用數(shù)據(jù)的數(shù)量和種類(lèi)將決定選擇SQL還是選擇NoSQL。
不論好壞,對(duì)于大多數(shù)項(xiàng)目而言,你可以有一個(gè)非分布式、可擴(kuò)展的關(guān)系數(shù)據(jù)庫(kù)作為系統(tǒng)中的單一數(shù)據(jù)源(single point of truth)。這是保持?jǐn)?shù)據(jù)一致性,支持復(fù)雜查詢(xún)的一種簡(jiǎn)易方法。
我希望本文對(duì)你有所幫助,但請(qǐng)記住每個(gè)項(xiàng)目不一樣,最終你要了解什么最適合你的要求。無(wú)論選擇是什么,我們開(kāi)發(fā)人員都很擅長(zhǎng)證明我們的技術(shù)選擇的合理性。不過(guò)我建議在充分考慮風(fēng)險(xiǎn)和優(yōu)勢(shì)后,再試用新技術(shù)。
原文標(biāo)題:Should You Use NoSQL Or SQL Db Or Both?,作者:Amit Ashwini
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】