鍵值。鍵值數(shù)據(jù)庫可以滿足游戲、零售和移動(dòng)等應(yīng)用程序的高可用性、低延遲需求。它的模式比較靈活,在會(huì)議管理、服務(wù)廣告內(nèi)容和管理用戶或產(chǎn)品文件方面有卓越的表現(xiàn)??傊?dāng)數(shù)據(jù)不是按一定模式,而是包含很多種代碼的時(shí)候,可以使用鍵值數(shù)據(jù)庫。
但如果要管理不同數(shù)據(jù)集之間復(fù)雜的關(guān)系,或使用非限定的鍵進(jìn)行查詢,鍵值數(shù)據(jù)庫的表現(xiàn)就欠佳了。
文檔數(shù)據(jù)庫。這種數(shù)據(jù)庫特別適合用于為每一個(gè)文檔存儲(chǔ)不同種類的數(shù)據(jù),可以實(shí)現(xiàn)跨數(shù)據(jù)的彈性的搜索。如果你的模式不是網(wǎng)格式的,你又需要指定鍵之外的東西進(jìn)行查詢,那么文檔存儲(chǔ)絕對是一個(gè)不錯(cuò)的選擇。文檔數(shù)據(jù)庫適合應(yīng)用于事件日志,線上購物,內(nèi)容管理和深度分析流程。對于要求快速原型的項(xiàng)目來說,文檔數(shù)據(jù)庫的模式靈活性也是一大亮點(diǎn)。
不過,文檔數(shù)據(jù)庫不適合復(fù)雜的事務(wù)處理。對于要求數(shù)據(jù)壓縮的應(yīng)用程序來說,文檔數(shù)據(jù)庫并不是一個(gè)很好的選擇,因?yàn)閺椥阅J揭馕吨缥臋n的數(shù)據(jù)不一致,也不可能被有效壓縮。
列式存儲(chǔ)。這種數(shù)據(jù)庫以列的方式存儲(chǔ)數(shù)據(jù)。與一個(gè)鍵(或識別符)相關(guān)的有很多列。和其他NoSQL數(shù)據(jù)庫一樣,它的模式很靈活,一個(gè)列式家族可以由不同的列組成。另外,列式存儲(chǔ)中的數(shù)據(jù)可以通過列訪問,而不是鍵。
列式存儲(chǔ)并不是一個(gè)新概念,它的變體過去作為一種概念應(yīng)用于關(guān)系型數(shù)據(jù)庫中(比如SAP Sybase IQ和IBM DB2 BLU)。雖然關(guān)系型列式存儲(chǔ)也聚焦與列,但它不允許跨行的列有所不同,這是它與NoSQL列式存儲(chǔ)不同之處。
對于不經(jīng)常寫,但要頻繁地一次讀取很多行的幾列的情況下,列式存儲(chǔ)是很有效率的。對于時(shí)間日志、內(nèi)容管理、分析的計(jì)算和分類,列式存儲(chǔ)都很有效。如果你有要過期的數(shù)據(jù),列式存儲(chǔ)非常有用,因?yàn)槟憧梢越⒁涣?,讓它自?dòng)過期。
如果是跨度很廣的查詢,不要用列式存儲(chǔ),因?yàn)槟憧赡懿坏貌恢匦略O(shè)計(jì)列。另外,列式存儲(chǔ)不是很適合ACID事務(wù)。
圖型數(shù)據(jù)庫。這種數(shù)據(jù)庫可能是和傳統(tǒng)數(shù)據(jù)庫以及其他NoSQL數(shù)據(jù)庫區(qū)別最大的。圖型數(shù)據(jù)庫適用于數(shù)據(jù)元素之間相互關(guān)聯(lián),而且彼此之間關(guān)系的數(shù)量不確定的情況。
圖型數(shù)據(jù)庫最常用于社交媒體網(wǎng)絡(luò),比如LinkedIn和Facebook。當(dāng)然也有一些其他的應(yīng)用程序,比如分配路線和調(diào)度、定位系統(tǒng)、公共交通連接、地圖、課程計(jì)劃和網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)等。圖型數(shù)據(jù)庫的另一個(gè)實(shí)踐在于推薦引擎,常用語在線零售商。
圖型數(shù)據(jù)庫不適合用于數(shù)據(jù)經(jīng)常改變,常發(fā)生大規(guī)模數(shù)據(jù)之間實(shí)時(shí)更新的情況。另外,如果你計(jì)劃跨網(wǎng)絡(luò)分區(qū)數(shù)據(jù)庫的話,圖型數(shù)據(jù)庫很可能會(huì)性能下降。
六大考慮因素
NoSQL數(shù)據(jù)庫之間的很多不同給技術(shù)選擇帶來了難度。不同的數(shù)據(jù)庫類型和產(chǎn)品有不同的架構(gòu)。即使同樣是NoSQL數(shù)據(jù)庫,不同類型之間也有所不同,沒有統(tǒng)一標(biāo)準(zhǔn),即便是訪問數(shù)據(jù)的標(biāo)準(zhǔn)也不相同。這意味著在不同的數(shù)據(jù)庫中訪問數(shù)據(jù),有不同的工具和應(yīng)用程序需要采用和學(xué)習(xí)。以下是需要考慮的一些方面。
快速變化。NoSQL領(lǐng)域是持續(xù)變動(dòng)的,特性不斷提升、功能不斷增加、甚至?xí)a(chǎn)生新產(chǎn)品。在選擇NoSQL數(shù)據(jù)庫時(shí),很難跟上最新最好的功能和產(chǎn)品。
對ACID的支持能力越來越強(qiáng)。NoSQL的一個(gè)早期賣點(diǎn)是它支持不要求全部ACID支持的事務(wù)。取代ACID,NoSQL提升了最終一致的基本可用軟件狀態(tài)服務(wù)(BASE)。雖然如此,很多應(yīng)用程序依然依賴ACID,NoSQL對ACID事務(wù)的支持是用戶的需求,也是它自己在不斷完善的。
缺少對多平臺(tái)的支持。大多數(shù)NoSQL數(shù)據(jù)庫起源于開源運(yùn)動(dòng),因此基本上都運(yùn)行在Linux上,(或者Unix的變體)。如果你需要在Windows或者主機(jī)上部署數(shù)據(jù)庫,你需要考慮商業(yè)產(chǎn)品,因?yàn)樯虡I(yè)產(chǎn)品對多平臺(tái)部署的支持性更好。
增加對SQL的支持。沒有SQL,查詢通常非?;A(chǔ),可能要求使用高級語言的復(fù)雜的代碼。當(dāng)然,產(chǎn)品與產(chǎn)品之間也有所不同,不過最好選擇支持SQL的NoSQL數(shù)據(jù)庫,因?yàn)楹芏嚅_發(fā)者熟悉的還是SQL語言。
開發(fā)多種類型數(shù)據(jù)庫的能力。一些NoSQL數(shù)據(jù)庫允許你用鍵值對、文檔和圖型的彈性的組合建模和部署數(shù)據(jù)。另外,關(guān)系型數(shù)據(jù)庫開始采用NoSQL能力。使用能夠開發(fā)多種類型數(shù)據(jù)庫存儲(chǔ)的數(shù)據(jù)庫系統(tǒng)能幫助你的組織獲得普適的持久性。
注意技術(shù)的版本。很多開源項(xiàng)目運(yùn)行了很多年,但也沒有第一版。這些軟件可能很好用,但慎重的公司一般不會(huì)選擇沒有發(fā)行第一版的技術(shù)。