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