第13期:怎樣看待存儲(chǔ)過(guò)程的移植困難
存儲(chǔ)過(guò)程移植困難是經(jīng)常被詬病的,在羅列存儲(chǔ)過(guò)程的缺點(diǎn)時(shí),這一條幾乎從來(lái)不會(huì)被遺漏。
存儲(chǔ)過(guò)程的移植確實(shí)很困難,一般業(yè)務(wù)邏輯復(fù)雜到需要寫存儲(chǔ)過(guò)程的地步,總會(huì)不可避免地用到數(shù)據(jù)庫(kù)獨(dú)有的特性和語(yǔ)法,更換數(shù)據(jù)庫(kù)時(shí)這部分代碼就需要重寫。如果只是簡(jiǎn)單地替換函數(shù)名和參數(shù)規(guī)則(如日期轉(zhuǎn)換等),那成本還不高;如果用到了新數(shù)據(jù)庫(kù)不支持的某種特性(如窗口函數(shù)),那還要重新設(shè)計(jì)算法來(lái)編寫計(jì)算邏輯;如果還要再兼顧性能因素,有時(shí)候就會(huì)是個(gè)不可能完成的任務(wù)了。
不過(guò),還好,存儲(chǔ)過(guò)程移植的情況并不頻繁。
多年前數(shù)據(jù)庫(kù)市場(chǎng)還處于混戰(zhàn)階段時(shí),用戶更換數(shù)據(jù)庫(kù)是相對(duì)常見的事情。而如今,傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)市場(chǎng)的競(jìng)爭(zhēng)已經(jīng)趨于穩(wěn)定,各個(gè)行業(yè)和業(yè)務(wù)采用的數(shù)據(jù)庫(kù)已經(jīng)基本定型。更換數(shù)據(jù)庫(kù)并不只是存儲(chǔ)過(guò)程移植這么一件事,用戶從使用習(xí)慣到維護(hù)人員配備等各方面都要做出很深刻的改變,這是個(gè)成本巨大的工程。如果沒(méi)有重大事件,一般不會(huì)發(fā)生數(shù)據(jù)庫(kù)移植的事件。存儲(chǔ)過(guò)程移植雖然困難,但并不足以成為不采用它的重要理由。
至于需要面對(duì)各種行業(yè)不同用戶的通用BI類軟件,雖然經(jīng)常要接入不同的數(shù)據(jù)庫(kù),但很少會(huì)用到存儲(chǔ)過(guò)程,只是些SQL函數(shù)更換,就沒(méi)有難度了。
其實(shí),仔細(xì)研究一下會(huì)發(fā)現(xiàn)。存儲(chǔ)過(guò)程的移植困難主要發(fā)生于從商用數(shù)據(jù)庫(kù)到開源數(shù)據(jù)庫(kù)(包括一些近年來(lái)興起的一些基于大數(shù)據(jù)平臺(tái)的數(shù)據(jù)倉(cāng)庫(kù))的切換過(guò)程。同價(jià)位的商用數(shù)據(jù)庫(kù)之間的移植難度并不是很大,而從開源數(shù)據(jù)庫(kù)到商用數(shù)據(jù)庫(kù)則更是容易(雖然這種現(xiàn)象發(fā)生較少)。
如前所述,存儲(chǔ)過(guò)程在數(shù)據(jù)庫(kù)之間的移植難度,語(yǔ)法不同只是個(gè)載體,更深層次的原因在于各個(gè)數(shù)據(jù)庫(kù)的功能特性不同。同價(jià)位的商用數(shù)據(jù)庫(kù),其功能相差并不大,移植時(shí)主要就是更換語(yǔ)法,難度就不會(huì)很大。而開源數(shù)據(jù)庫(kù)在功能方面和成熟的商用數(shù)據(jù)庫(kù)相差很遠(yuǎn),雖然大家都叫數(shù)據(jù)庫(kù),都能跑基本SQL,但差別是巨大的,從許多關(guān)鍵的特性上看根本就是兩個(gè)不同的產(chǎn)品。比如世界上***的那個(gè)商用數(shù)據(jù)庫(kù),對(duì)SQL2003的標(biāo)準(zhǔn)支持得很好,有較完整的窗口函數(shù);而世界上那個(gè)***的那個(gè)開源數(shù)據(jù)庫(kù),別說(shuō)窗口函數(shù),連FULL JOIN都要轉(zhuǎn)換成UNION來(lái)做。這時(shí)候想移植存儲(chǔ)過(guò)程,那就是相當(dāng)于完全重新開發(fā)。這個(gè)困難根本就不是移植造成的,如果當(dāng)初選擇開源數(shù)據(jù)庫(kù)建設(shè)應(yīng)用,那困難一樣的大。
我們說(shuō)移植成本,是指基于兩個(gè)能力基本相當(dāng)?shù)钠脚_(tái),最初的開發(fā)工作無(wú)論基于哪個(gè)平臺(tái),復(fù)雜度是差不太多的。比如一段C++程序,在Windows上寫和在Linux上寫,難度區(qū)別并不大,這時(shí)候討論移植工作量才有意義;但要把一段Java程序轉(zhuǎn)換成C++程序,這就不是個(gè)移植問(wèn)題了,初始的開發(fā)復(fù)雜度就相差巨大。從商用數(shù)據(jù)庫(kù)到開源數(shù)據(jù)庫(kù)的遷移大抵類似于這種。
目前,從商用數(shù)據(jù)庫(kù)切換到開源數(shù)據(jù)庫(kù)或大數(shù)據(jù)平臺(tái)是一個(gè)業(yè)內(nèi)趨勢(shì),這樣做在數(shù)據(jù)庫(kù)建設(shè)成本上會(huì)下降許多。不過(guò)這個(gè)世界是公平的,購(gòu)置數(shù)據(jù)庫(kù)的成本下降了,而這并不是技術(shù)進(jìn)步帶來(lái)的結(jié)果,那就從開發(fā)成本上找補(bǔ)回來(lái)吧。