討論:新興數(shù)據(jù)庫打破整個舊規(guī)則
有經(jīng)驗的數(shù)據(jù)庫管理員稱這些新興數(shù)據(jù)庫為“玩具”,認為它們有很嚴重的威脅,而這些威脅就是來自這些新興的數(shù)據(jù)庫。一些傲慢的家伙為新興數(shù)據(jù)庫很好用,速度很快,滿足他們手頭的需求,置威脅于不顧。
非關(guān)系型數(shù)據(jù)庫正在吸引人們的注意,因為它們可以忽略許多的規(guī)則,而這些規(guī)則正是經(jīng)驗豐富的數(shù)據(jù)庫管理員積累的深刻教訓。問題是現(xiàn)在這些規(guī)則的條條款款已成為一種束縛,使得很難創(chuàng)建一個真正強大的、讓多臺計算機一起運行的數(shù)據(jù)庫系統(tǒng)。因為所有的Web應(yīng)用程序設(shè)計者都夢想構(gòu)建一個多機運行的應(yīng)用程序,保存所有用戶的所有數(shù)據(jù),要想做到這些,有些老的規(guī)則需要避開,甚至是打破。
首當其沖的事情就是摒棄舊的JOIN操作。大學生曾經(jīng)嚴格的按照課后作業(yè)的要求,如何標準化數(shù)據(jù),將一個表格劃分為許多的部分。那個時候磁盤非常貴,數(shù)據(jù)標準化工作顯得額外重要。問題當數(shù)據(jù)分散在不同機器上的時候,JOIN操作真的使得速度變得很慢?,F(xiàn)在磁盤空間非常便宜,許多數(shù)據(jù)模型并沒有從數(shù)據(jù)標準化中受益,因此JOIN操作很容易就被摒棄。
立即一致性和最終一致性的差別依賴數(shù)據(jù)的重要性來定。那些聽到這些新興數(shù)據(jù)庫就要拿心臟病藥的保守者通常是銀行的程序員,它們希望確保每天結(jié)束后收支相等。畢竟銀行的領(lǐng)導不能忍受由于失敗的數(shù)據(jù)庫事務(wù)而導致帳目出錯。
但是許多現(xiàn)代的Web站點不會因為某個事務(wù)失效而不能運行的。我看見Facebook經(jīng)常有小故障。不會因為某些評論數(shù)據(jù)丟失了就不能運行了。這些網(wǎng)站不會像銀行那樣苛刻關(guān)注帳目清算,它們不需要關(guān)系數(shù)據(jù)庫所有的功能。(一些人開玩笑說銀行應(yīng)該把購買Oracle許可證的錢拿出來成立一個基金,賠償那些因為失敗的事務(wù)操作導致錢丟失的人們。)
為了更好地理解這些非關(guān)系型數(shù)據(jù)庫的擴展層,我撿了幾個進行測試,構(gòu)建了幾個測試應(yīng)用程序。發(fā)現(xiàn)它們主要的命令操作不會超過這三個:插入、更新、刪除。有一些提供群集,有一些只能提供某種服務(wù),有一些夸大其詞說接管整個
文中我沒有介紹其它幾個有趣的數(shù)據(jù)庫,一是由于本文篇幅限制,二是因為它們和我以下提到的幾個沒有多大的區(qū)別。舉個例子,Sun公司正在構(gòu)建一個關(guān)系型數(shù)據(jù)庫,稱之為Derby,用Java虛擬機一起使用。Oracle也有它自己的嵌入式數(shù)據(jù)庫,叫做BerkeleyDB,但是現(xiàn)在稱之為OracleEmbeddedDatabase。有些程序員甚至創(chuàng)建了低費用的程序庫,將對象直接寫入到磁盤中。這些產(chǎn)品也延伸了“數(shù)據(jù)庫”這幾個字眼的含義,但是我不準備在這里陳述它們。
AmazonSimpleDB數(shù)據(jù)庫
SimpleDB設(shè)計初衷是和Amazon的SimpleStorageService(S3)一起使用的,但是每對鍵值的大小限制在1024字節(jié)。這對于很多的字符串來說,已經(jīng)足夠了,但是對于許多的內(nèi)容引擎是不夠的。因此你在S3中存儲的是數(shù)據(jù)的指針。
現(xiàn)在使用類似JOIN這樣的操作還有一些限制,需要多種調(diào)用。每個查詢只能運行5秒鐘。結(jié)果僅能保持250個item。每個item僅有250對。還有許多的常見操作有限制,有人開始思考SimpleDB是給我們的生活帶來了便捷或是麻煩。
Amazon開始重寫API,企圖得到更多更好的認證。到2009年9月,整個SSL都會運行call,提供
該公司也創(chuàng)建了更多的程序庫,讓服務(wù)的使用更加簡單。這里有許多的
現(xiàn)在價格也很合適。Amazon最近將存儲的價格從1.5美元降到25美分每G字節(jié)。公司將收費透明化,目的是激勵用戶來計劃他們的消費預(yù)算。
Amazon有一套先進的條款來處理使用期限問題。有許多的條款來處理你可能遇到的問題,有一些吸引了我的注意力。舉個例子,Amazon申明,“我們可能刪除最近6個月存在SimpleDB中卻沒有訪問的內(nèi)容,但是不用負任何責任?!边@對于只是為了給系統(tǒng)做測試的人來說很容易接受。從措辭來看,Amazon此舉的目地就是為了保持它的數(shù)據(jù)中心良好運行。
還有其他的一些問題。舉個例子,使用期限條款包括一長列禁止數(shù)據(jù),如“助長非法活動”,帶有“種族、性別、宗教、國籍、殘疾、性取向、年齡”歧視的數(shù)據(jù)都是禁止的。這存在一個問題。想像一下如果為某個教堂開展反男同性戀婚姻運行了一個網(wǎng)站。這聽起來你確實有性取向歧視。但是,如果你是開展男同性戀婚姻的宣傳活動,反對這些教堂的呢,這個時候還能說你是在歧視這些基本的宗教信仰嗎?
我對那些正在分析處理這些抱怨的律師感到遺憾,但是至少他們可以高枕無憂了,因為他們知道這些數(shù)據(jù)可以以任何理由或者是沒有理由的刪除掉。如果你僅使用免費的服務(wù),Amazon不會給你任何通知,就會刪除你的數(shù)據(jù),但是你如果是付費用戶,就承諾有60天的提醒通知,在期限內(nèi)你就能將你的數(shù)據(jù)取回。
SimpleDB是兩級分層結(jié)構(gòu)。最上面的一級是"domain",第二級是"item"。在你選擇domain和item名之后,你就寫入了鍵值。SimpleDB相對來說有豐富的API,擁有對數(shù)據(jù)排序能力,甚至具備計算出匹配查詢結(jié)果的item數(shù)目的能力。你甚至能寫查詢語句,可以查詢那些不從某個特定字符串開始的值。這或許和我們使用的SQL和Oracle數(shù)據(jù)有很大的區(qū)別,但是這些低租金的數(shù)據(jù)庫也有自身的缺點,甚至不能對結(jié)果集進行排序。
GoogleAppEngine
GoogleAppEngine本質(zhì)上不是一個數(shù)據(jù)庫。他是一種云技術(shù),用于分布式Python應(yīng)用程序,它是和自己隱藏在內(nèi)部某個地方的數(shù)據(jù)庫一起工作的。不首先通過應(yīng)用程序?qū)觼碓L問數(shù)據(jù)庫是不可能的。但是封裝一個數(shù)據(jù)庫命令和格式化請求數(shù)據(jù)并不困難,因此我們可以認為AppEngine是一個數(shù)據(jù)庫,只不過這個數(shù)據(jù)庫附加了一個以Python語言寫的嵌入程序。
檢索有意做成類似于SQL查詢,實際上,Google提供它自己的類SQL語言,GQL。使用的時候,GQL被解析成查詢語句。AppEngine還有一套基于Python的方法集,方法集合拴在一起處理數(shù)據(jù)集合和查詢。你不需要浪費分析查詢周期。
值得一提的是Python棧包括了一些最好的數(shù)據(jù)庫也不具備的功能特性。有一個程序庫來操作圖像文件,通過剪切和Goolge特有的“Ifeellucky”功能對圖片進行修補。你也可以將數(shù)據(jù)存儲為Goolge文檔,電子表格和日程數(shù)據(jù)項。起初AppEngine看起來僅僅像是一個數(shù)據(jù)庫,但是你也能容易的在Google棧里進行數(shù)據(jù)抽取。
直到幾周前,AppEngine還在測試階段,使用它是免費的。只要你的使用空間大小在基本的限額之內(nèi),它仍舊是免費的。另外,Google的收費機制和Amazon極為相似。存儲的價格比Amazon的更便宜(每月每G字節(jié)12美分),帶寬的收費是相同的(10美分沒G字節(jié))。
Google的使用期限責任制與Amazon的不同。你需要制定一個個人隱私策略,保護你用戶的數(shù)據(jù)。如果你的用戶違反了版權(quán)規(guī)定,你必須反應(yīng)給DMCA(千禧年數(shù)字版權(quán)法),你不這么做的話,Google將會為你這么做。Google保留在任何時間以任何理由刪除內(nèi)容的權(quán)利?!澳阃釭oogle刪除、丟失任何存儲內(nèi)容和服務(wù)試用期傳送內(nèi)容、保持的
這些條款越來越受到關(guān)注?,F(xiàn)在Google承諾在決定注銷賬戶前預(yù)留90天的時間讓你將數(shù)據(jù)從
存在這么一個問題,如果你決定離開Google或者說Google讓你離開時該怎么辦。Google發(fā)布了一個不錯的開發(fā)工具,讓你輕松在本地機器上測試你的應(yīng)用程序。使用這些工具在你機器上測試是沒有技術(shù)問題的,除非你沒有支持類云技術(shù)的功能。包括測試在內(nèi)的數(shù)據(jù)存儲自身是不會自動復制自己的,但是在自己本地機器上卻能實現(xiàn)其它的功能。像以前一樣,有一些法律問題,因為“許可證的唯一目的就是讓你使用和享受提供服務(wù)的好處。”
ApacheCouchDB數(shù)據(jù)庫
毫無疑問我們需要使用云技術(shù)來享受這些新的服務(wù)。CouchDB是眾多開源項目中的一個,該項目構(gòu)建了一個用于
CouchDB與Amazon的工具是相似的,但是它有一些特別之處。你仍舊以行的形式來存儲key-valuepairs,但是這些key-valuepairs可以是任何標準的JSON(JavaScriptObjectNotation)數(shù)據(jù)類型,如布爾和數(shù)字類型。值的范圍不局限于1024字節(jié)長度的字符串,有辦法可以讓其存儲長數(shù)值,甚至是圖形。所有的請求和響應(yīng)格式化為JavaScript。沒有基于XML的WebServices,只有JSON.
最大的不同在于寫查詢語句。CouchDB可以通過JavaScript單獨寫mapfunctions和reducefunctions。一個簡單的查詢或許僅僅就是一個mapfunction,帶有一個“If”子句來測試數(shù)據(jù)比某個數(shù)值大還是小。只有在你試圖計算統(tǒng)計由mapfunctions查詢的數(shù)據(jù)時才會用到reducefunctions。發(fā)現(xiàn)計算行的個數(shù)很容易辦到,但是也有可能丟失了一些其它很酷的特性,因為mapfunction只能由JavaScript來寫。我除了發(fā)現(xiàn)計算出匹配的數(shù)目,至于其他的非學術(shù)的用途我還沒有弄清楚。文檔包括了一個給人印象很深刻的reductionfunction,用來歸并統(tǒng)計的,但是我不知道CouchDB真的是否是處理這類事情的正確工具,如果你需要更復雜的統(tǒng)計,妥當?shù)木褪菆猿质褂脗鹘y(tǒng)的數(shù)據(jù)庫,獲得統(tǒng)計報表。
這個項目還有一些限制的。項目的首頁稱之為“一種分布式,容錯,自由面向文檔模式的數(shù)據(jù)庫,”沒有一些人工干預(yù)你是不會獲得分布式和容錯功能的。CouchDB有一個好看的AJAX用戶界面,包含了一個form表單,能讓你復制數(shù)據(jù)庫。但是還不是自動的。
CouchDB計劃會增加存取控制和
使用純JavaScript也并非壞事。當我使用這些數(shù)據(jù)庫的時候,我很快發(fā)現(xiàn)有人能夠在客戶端開發(fā)一個安全模型層,使用一些不錯的加密技術(shù)。在客戶端加強安全控制,就能減少
這個特點正在驅(qū)使一些極端用戶使用CouchDB作為整個服務(wù)器棧。J.ChrisAnderson,項目的委托人之一,寫了一篇文章,證明CouchDB是一個應(yīng)用程序服務(wù)器的全部所需。用于顯示和與數(shù)據(jù)交互的業(yè)務(wù)邏輯是用JavaScript編寫的,從CouchDB下載后是一個JSON數(shù)據(jù)包。
在Anderson的眼里,當所有的功能都能用JavaScript實現(xiàn),在服務(wù)器上使用Ruby、Python、Java、PHP沒有什么大的意義。這種看法或許有些極端,因為總會遇到一些情況,客戶機器不能保證能正確的實現(xiàn)一些功能,客戶端的客戶比我們知道的東西少。像CouchDB這種輕量級的工具使得人們開始考慮完成一項工作真正需要多少代碼。
Persevere數(shù)據(jù)庫
初一看,Persevere數(shù)據(jù)庫像其它大多數(shù)數(shù)據(jù)庫一樣。將鍵值對錄入進去,它就將其
由于Persevere與Dojo連接緊密,Persevere提供了大量的連通性。你可以創(chuàng)建網(wǎng)格,樹形窗口小部件,接著將其直接鏈接到JsonRestStore,窗口小部件讓你編輯數(shù)據(jù)。你可以通過20行的JavaScript代碼就能遠程訪問一個數(shù)據(jù)庫。
我遇到過許多的小的誤操作,這些誤操作可能是由于我缺乏經(jīng)驗導致,而不是潛在的Bug。當我準確的弄清楚如何做的時候,一些操作就會正確啟動。Persevere本身并不是特別需要掌握,但是AJAX框架是你直接面對的。來自Dojo的文檔比大多數(shù)AJAX框架要好,但是你得花一些時間來學習Dojo,才能掌握隱藏在Persevere表面后的潛在復雜性問題。
云技術(shù)和群集
嘗試了這些數(shù)據(jù)庫之后,我能明白為什么有人會一直稱它們?yōu)椤巴婢摺薄K鼈児δ苡邢?,即便有新的功能,但是這些新的功能會約束你的選擇。許多次我意識到SQL世界的標準功能讓生活更加簡單。許多基于標準SQL的工具,如報表引擎,不能連接這些新興的數(shù)據(jù)庫。使用MySQL或者Oracle這些數(shù)據(jù)庫能夠完成許多重大的功能。
但是,這不代表將來在我的項目中我不去使用這些新興的數(shù)據(jù)庫。它們是固態(tài)數(shù)據(jù)存儲,與AJAX集成得如此緊密,使得開發(fā)更加容易。另外,多數(shù)Web站點不需要MySQL或者Oracle的所有功能,JOIN-free模式對許多普通數(shù)據(jù)結(jié)構(gòu)仍舊非常有用,包括一對多關(guān),一對一關(guān)系型數(shù)據(jù),甚至多對一關(guān)系。
另一個問題是是否使用云技術(shù)或者構(gòu)建你自己的群集。Google和Amzon都提供多機服務(wù)承諾,CouchDB和Persevere是不能匹敵的。Persevere團隊聲稱在將來將會擴展。但是很難預(yù)料Amazon和Google的承諾有多好。如果Amazon和Google丟失了一個硬盤怎么辦?如果它們丟失了一個機架怎么辦?他們還沒有做出很清晰的承諾和使用期限所負的責任。
舉個例子,Amazon的條款重復聲明了很多次:“我們對于為授權(quán)的訪問、改變、刪除、損害、丟失任何你的內(nèi)容、應(yīng)用程序,或者你提交的數(shù)據(jù)、服務(wù)帳號都不負責任?!?/P>
我不是說在責備Amazon或者是Google,因為誰都不知道誰應(yīng)該對丟失的事務(wù)負最終的責任。有可能是任何一個程序員,實際上也很難判斷誰破壞的。但是,我們知道更多信息會更好。SimpleDB中的數(shù)據(jù)是存儲在RAID磁盤中嗎?當同一地區(qū)發(fā)生地震,颶風或者火災(zāi)時別的地區(qū)另外的備份嗎?在線備份社區(qū)正準備開始提供這類服務(wù)的細節(jié)了,但是云技術(shù)還沒有計劃這樣做。
所有這些顧慮讓我們清楚的認識到他們?nèi)耘f是玩具數(shù)據(jù)庫,打破了傳統(tǒng)數(shù)據(jù)庫的規(guī)則,對那些可以忍受數(shù)據(jù)丟失的應(yīng)用程序是合適的。它們很有趣,有快,在價格方面也很合適,你的注意力可以不用放在選擇數(shù)據(jù)庫提供商,而是放在如何解決沒有JOIN操作怎么辦的問題上。
【編輯推薦】
- 云計算推波助瀾 非關(guān)系數(shù)據(jù)庫蓄勢待發(fā)
- 關(guān)系數(shù)據(jù)庫的末日是否已經(jīng)來臨
- 云計算中無法使用關(guān)系型數(shù)據(jù)庫?