NoSQL真的能終結(jié)關(guān)系數(shù)據(jù)庫?
一、NoSQL項目提出的背景。
NoSQL的支持者喜歡這個NoSQL項目,主要是看其在性能上的優(yōu)勢。NoSQL支持者稱,NoSQL技術(shù)可以打破傳統(tǒng)關(guān)系型數(shù)據(jù)庫的性能瓶頸。如通過NoSQL架構(gòu)可以省去將Web或者Java 應(yīng)用和數(shù)據(jù)轉(zhuǎn)換成SQL友好格式的時間,減少SQL語句解析與優(yōu)化的時間,讓應(yīng)用程序的速度變得更加快捷。更多關(guān)于NoSQL的報道請參考《對SQL說不!NoSQL的數(shù)據(jù)庫技術(shù)革命》
確實(shí)基于SQL的關(guān)系型數(shù)據(jù)庫,在性能上確實(shí)存在一些瓶頸。但是這大部分并不是這個門SQL技術(shù)所造成的。而是因為在設(shè)計數(shù)據(jù)庫的時候,表與表之間的關(guān)系、表的索引或者表空間的部署等等沒有設(shè)計好做造成的。所以關(guān)系型數(shù)據(jù)庫性能不理想,并不能全部怪罪到這么技術(shù)上。通常情況下,對原有的數(shù)據(jù)庫設(shè)計進(jìn)行優(yōu)化,往往可以在很大程度上提升數(shù)據(jù)庫的性能。所以說,NoSQL這個項目的背景是站不住腳的。
二、NoSQL革命仍然需等待。
根據(jù)目前的情況來看,筆者對于NoSQL項目的前景并不是很看好。或者說,對其前途感到很悲觀。NoSQL項目很難跟傳統(tǒng)的關(guān)系型數(shù)據(jù)庫相抗衡。甚至其想達(dá)到MySQL這個開源數(shù)據(jù)庫的高度都很難。
1、 NoSQL很難實(shí)現(xiàn)數(shù)據(jù)的完整性。
當(dāng)NoSQL這個項目開始以來,筆者也適當(dāng)?shù)年P(guān)注過。但是筆者了解了這個項目后,對它的印象并不是很好。因為根據(jù)筆者的了解,很多關(guān)系型數(shù)據(jù)庫中優(yōu)秀的、實(shí)用的功能,在NoSQL數(shù)據(jù)庫卻無法實(shí)現(xiàn)。如在任何一個關(guān)系型的數(shù)據(jù)庫中,都可以很容易的實(shí)現(xiàn)數(shù)據(jù)的完整性。如在Oracle數(shù)據(jù)庫中,可以輕而易舉的實(shí)現(xiàn)實(shí)體完整性(通過主鍵或者非空約束來實(shí)現(xiàn))、參照完整性(通過主鍵、外鍵來實(shí)現(xiàn))、用戶定于完整性(通過約束或者觸發(fā)器來實(shí)現(xiàn))。通過這些機(jī)制,可以實(shí)現(xiàn)數(shù)據(jù)的完整性。如可以設(shè)置某表中某一個列的值是唯一的而且不能夠為空。或者說在某表中引用外鍵的話,在另一張表中這個值必須存在。無論在刪除或者更新的時候,都必須存在。
NoSQL支持者也承認(rèn)關(guān)系型數(shù)據(jù)庫在數(shù)據(jù)完整性上的作用是不可替代的。但是他們卻反駁說,企業(yè)可能用不到這么復(fù)雜的功能。對于這一點(diǎn)筆者不敢認(rèn)同。現(xiàn)在企業(yè)的任何一個應(yīng)用,基本上都需要用到數(shù)據(jù)完整性。如現(xiàn)在大部分應(yīng)用至少都需要有一個用戶認(rèn)證的過程。為此在系統(tǒng)實(shí)現(xiàn)的過程中,需要在數(shù)據(jù)庫中保存用戶名。由于這個用戶名涉及到用戶的認(rèn)證問題,為此用戶名必須要唯一。此時就需要用到唯一性約束。在關(guān)系型數(shù)據(jù)庫中,只需要在表格設(shè)計過程中,將用戶名設(shè)置為唯一即可。而在NoSQL中,還需要通過代碼來實(shí)現(xiàn)唯一性。本來很容易就可以實(shí)現(xiàn),現(xiàn)在卻要繞個彎取實(shí)現(xiàn),這有點(diǎn)不可思議。由于在NoSQL項目中很難實(shí)現(xiàn)數(shù)據(jù)的完整性,而在企業(yè)應(yīng)用中這個數(shù)據(jù)完整性又是少不了的。為此筆者認(rèn)為,NoSQL項目很難在企業(yè)中普及開來。至少在短時間內(nèi),NoSQL革命仍然需等待。
2、 缺乏強(qiáng)有力的技術(shù)支持。
到目前為止,NoSQL項目都是開源的。所以說他們?nèi)狈?yīng)商技術(shù)人員提供的正式支持。在這一點(diǎn),NoSQL項目與大多數(shù)的開源項目一樣,不得不從社區(qū)中尋求支持。但是,NoSQL項目比其他的開源項目要難得的多。首先NoSQL項目是一個數(shù)據(jù)庫系統(tǒng)的項目。或者說,是一些網(wǎng)絡(luò)應(yīng)用的最基層的設(shè)備。如果其出錯的話,后果很嚴(yán)重。由于缺乏正式的官方支持,萬一數(shù)據(jù)庫運(yùn)行出現(xiàn)了錯誤,后果是很嚴(yán)重的。而且到時候用戶也是投訴無門的。所以,現(xiàn)在NoSQL項目基本上還是屬于研究的階段,如果要正式投入到企業(yè)中使用,被數(shù)據(jù)庫管理員所接受,至少其穩(wěn)定性上要有所改善。或者說,當(dāng)問題出現(xiàn)時,數(shù)據(jù)庫管理員要能夠及時修復(fù)運(yùn)行故障。由于缺乏強(qiáng)有力的技術(shù)支持,數(shù)據(jù)庫管理員擔(dān)心故障出現(xiàn)時難以迅速解決,所以很多管理員都拒絕使用NoSQL項目,即使其是開源免費(fèi)的。如NoSQL項目的組織者Oskarsson也坦言,他們自己的公司現(xiàn)在使用的也不是NoSQL數(shù)據(jù)庫,甚至在短期內(nèi)也沒有這個打算。他們現(xiàn)在使用的雖然是開源的數(shù)據(jù)庫系統(tǒng),但是仍然是基于SQL的關(guān)系型數(shù)據(jù)庫。像NoSQL項目的組織者都不敢輕易在企業(yè)中部署這個NoSQL數(shù)據(jù)庫,那么其他數(shù)據(jù)庫管理員誰敢做***個吃螃蟹的英雄嗎?這不是拿自己的前途開玩笑。
3、 開源數(shù)據(jù)庫從出現(xiàn)到被用戶接受需要一個漫長的過程。
假設(shè)這個NoSQL技術(shù)能夠被企業(yè)用戶所接受,但是從其出現(xiàn)到被用戶最終接受需要一個漫長的過程。如MYSQL這個開源的數(shù)據(jù)庫系統(tǒng),其從出現(xiàn)到流行也是花了好多年的時間。而且MYSQL數(shù)據(jù)庫是基于比較成熟的關(guān)系數(shù)據(jù)庫模型的。其在開發(fā)設(shè)計的時候,已經(jīng)有不少完善的產(chǎn)品可以參考。至少SQL語句的語法其可以直接拿來使用,而不用從零開始設(shè)計。而現(xiàn)在NoSQL是一個從零開始的產(chǎn)品,所有內(nèi)容都需要重新設(shè)計。在沒有供應(yīng)商技術(shù)人員的支持下,這個過程可能是很漫長的。即使退一萬步來說,最終其可以向MySQL數(shù)據(jù)庫那樣受中小企業(yè)的歡迎,但是由于其自身技術(shù)的薄弱,在大型的數(shù)據(jù)庫應(yīng)用中就會顯得心有余而力不足。
4、 關(guān)系型數(shù)據(jù)庫在設(shè)計時更能夠體現(xiàn)實(shí)際。
其實(shí)關(guān)系型數(shù)據(jù)庫也是從非關(guān)系型數(shù)據(jù)庫升級過來的。之所以現(xiàn)在大部分?jǐn)?shù)據(jù)庫都是建立在關(guān)系型數(shù)據(jù)庫模型之上的,就說明了關(guān)系型數(shù)據(jù)庫存在的價值。筆者認(rèn)為,關(guān)系型數(shù)據(jù)庫***的價值就在于其設(shè)計方便。因為其數(shù)據(jù)庫對象之間的關(guān)系模型(如三范式等等)對于數(shù)據(jù)庫設(shè)計時很有幫助的,其在很大程度上體現(xiàn)了業(yè)務(wù)的實(shí)際情況。如在設(shè)計一個ERP系統(tǒng)時,主鍵與外鍵的關(guān)系可以反映出產(chǎn)品信息表與采購訂單之間的關(guān)聯(lián)。這種關(guān)系是那么發(fā)符合實(shí)際。而現(xiàn)在NoSQL項目想把這種關(guān)系剝離掉,那么在數(shù)據(jù)庫設(shè)計的時候,必然會增加很多的麻煩,會增加數(shù)據(jù)庫的難度。最重要的是,這些數(shù)據(jù)庫對象之間的關(guān)系不僅僅是關(guān)系而已,其還是一種強(qiáng)有力的準(zhǔn)則,對于所有的關(guān)系型數(shù)據(jù)庫管理員都會產(chǎn)生約束。這就說明,如果必須強(qiáng)制遵守這些規(guī)則。從而讓Oracle數(shù)據(jù)庫的管理員經(jīng)過簡短的學(xué)習(xí)之后,也能夠很快的掌握SQLServer數(shù)據(jù)庫的技術(shù)。因為其內(nèi)部的準(zhǔn)則是共同的。數(shù)據(jù)庫管理員只要學(xué)習(xí)其表現(xiàn)形式即可。這就好像學(xué)汽車。你只要拿出駕照,那么什么牌子的車都可以開。因為其數(shù)據(jù)庫對象的關(guān)系、運(yùn)行模式等等都是固定的。但是NoSQL項目由于缺乏這種關(guān)系,所以基于NoSQL技術(shù)的不同產(chǎn)品之間,可能會存在很大的差異。這不僅在數(shù)據(jù)庫設(shè)計的時候會增加不少的難度。而且在維護(hù)的時候,也需要花費(fèi)更多的時間與精力。
總之,照目前的情況來看,筆者對NoSQL項目的思路是反對的。至少在近期很難有像樣的NoSQL產(chǎn)品面世。NoSQL項目的組織者Oskarsson也承認(rèn),NoSQL項目這場數(shù)據(jù)庫革命仍然需要等待。在短時間內(nèi),無法跟關(guān)系型數(shù)據(jù)庫相互抗衡,也許永遠(yuǎn)沒有這個機(jī)會。
【編輯推薦】