新聞中心
男主角:Wuvist(新浪微博),真名翁偉,自稱胖程序員一個,幸好已婚。學(xué)習(xí).NET出身,現(xiàn)常用Python做服務(wù)器端開發(fā),曾任新加坡某創(chuàng)業(yè)公司主程。公司被Techcrunch blog過后,覺得新加坡生活太過安逸,終于在去年辭職只身回家鄉(xiāng)汕頭創(chuàng)業(yè),活躍于珠三角技術(shù)沙龍,熱衷于與其他技術(shù)宅分享。

創(chuàng)新互聯(lián)公司是工信部頒發(fā)資質(zhì)IDC服務(wù)器商,為用戶提供優(yōu)質(zhì)的達州電信機房服務(wù)
[[57685]]
本文作者:Wuvist
女主角:Katze,Wuvist的老婆,女程序員,在某跨國投行任Unix系統(tǒng)管理員,常被Wuvist嘲笑技術(shù)太差。
[[57686]]
【獨家特稿】查看全部課程請訪問《宅男程序員給老婆的計算機課程》
在幾乎所有的web應(yīng)用中,數(shù)據(jù)庫都是核心的一環(huán)。
Web應(yīng)用往往都是“Database driven”,業(yè)務(wù)、數(shù)據(jù)都是由數(shù)據(jù)庫完成,而前端頁面僅僅是演示、修改數(shù)據(jù)的一個“殼”。
因此很多web框架,都會標榜自己能夠兼容多少多少數(shù)據(jù)庫,做CRUD多么多么容易。
一般上,提到數(shù)據(jù)庫的時候,指的都是關(guān)系型數(shù)據(jù)庫;但關(guān)系型數(shù)據(jù)庫并非唯一的一種數(shù)據(jù)庫類型。
關(guān)系型數(shù)據(jù)庫,一開始便是設(shè)計為通用,并有ACID支持的。
Atomicity 原子性、 Consistency 一致性、Isolation 隔絕性、Durability 持久性
殺手歐陽盆栽說:“每件事都有它的代價”。上述四個特性,都是有代價的。
對于嚴謹?shù)纳虡I(yè)應(yīng)用,如銀行、交易系統(tǒng);為求業(yè)務(wù)的安全,他們不得不,或者說,能夠并且愿意付出這些代價。
回到12306,后端數(shù)據(jù)庫傳說使用的是Oracle,而站出來說吐槽12306的行家往往都會提到 redis \ mysql 這樣的替代。
有些菜鳥“ED”看到這些吐槽就出來噴了,說這些行家不懂神馬業(yè)務(wù)安全性的重要,這幫做互聯(lián)網(wǎng)的弱爆了,票務(wù)是必須使用 Oracle才能搞定云云。
好像還有人專門去噴了Fenng,這實在是太諷刺了。Fenng實際上是Orcale ACE Director http://www.hudong.com/wiki/%E5%86%AF%E5%A4%A7%E8%BE%89,國內(nèi)屈指可數(shù)的Oracle專家。
很多人,特別是弱“ED”、“專家教授”,沉寂在自己所在的領(lǐng)域,然后就以為“悟”了;實際上,僅是把自己變成了井底之蛙。
知識的廣博、全面性非常重要。
在某個領(lǐng)域,通用的東西成熟之后,往往就會有專用的解決方案出現(xiàn)。而專用的解決方案多了之后,又會有新的通用解決方案出現(xiàn)。
天下大勢,分久必合,合久必分。
計算機,最早有很多專用系統(tǒng),如王安打字機;個人電腦通用之后,這些專用設(shè)備就湮滅了;而iPad、手機的涌現(xiàn),則又是專用系統(tǒng)。
是的,傳統(tǒng)上需要去購買 Orcale、DB2 等巨貴無比的數(shù)據(jù)庫系統(tǒng),去滿足業(yè)務(wù)需求;不是因為它們把問題解決到了極致,而是因為沒有別的選擇。時代已經(jīng)變了,井底之蛙若把Oracle當(dāng)成是王道,那只能被時代淘汰。
關(guān)系型數(shù)據(jù)庫作為通用解決方案,是非常非常好的;它是一把神刀。
但是,它有以下問題:
===== ED總是要寫爛SQL ====
首先. 還是那句話,有的人縱然神刀在手,亦無法成為刀中之神。關(guān)系型數(shù)據(jù)庫提供的SQL能力,是高度抽象的,封裝了無數(shù)層的。寫SQL的人,太多太多根本不了解SQL背后所執(zhí)行的事情;爛“ED”都是如此。
這甚至造就了一個職業(yè):DBA。DBA去負責(zé)數(shù)據(jù)庫微調(diào)、優(yōu)化,聽起來很高級,但實質(zhì)上,就是給濫用SQL的“ED”擦屁股而已。
對于龐大的企業(yè)來說,管理者是知道大部分ED都弱爆了,他不期望也不需要ED去了解數(shù)據(jù)庫,他只需要ED去完成最基本的業(yè)務(wù)功能,然后讓DBA去給ED擦屁股。
大部分的ED,并沒有意識到這一點;他們拼命去追求方便快捷的“搞定”;濫用SQL的各種高級功能;甚至,他們把分享SQL的復(fù)雜使用當(dāng)成是樂事。
ED所努力的,是把自己變笨,把活盡可能的都交給神奇的數(shù)據(jù)庫去解決;數(shù)據(jù)庫怎么解決的,他們不關(guān)心;這實質(zhì)上,是在削弱自己工作的技術(shù)含量,自我貶值而已。
工程師如果能夠把數(shù)據(jù)庫給用好了,哪里還有DBA什么事?
DBA所謂的數(shù)據(jù)庫優(yōu)化,往往就是把工程師不負責(zé)任寫下的2B SQL查詢找出來,然后改寫為文藝方式罷了。
不要濫用數(shù)據(jù)庫,一點都不難。
===== 通用數(shù)據(jù)庫性能有極限 =====
其次,關(guān)系型數(shù)據(jù)庫作為通用解決方案,它提供了太多的東西,它做了太多的事,而所有的事情,都有它的代價,直接而言,就是犧牲性能了。
所以,DBA的另一個職責(zé),則是把數(shù)據(jù)庫的各種參數(shù)調(diào)配好,讓其能夠發(fā)揮最高的性能。
從這個意義上去說,DBA的工作就不僅僅是給ED擦屁股了。
但,這樣的微調(diào),是有極限的。DBA拚了命去把雞蛋豎立起來,考慮了桌面摩擦、空氣流動、手指顫抖等等因素,雞蛋雖然可以豎立一會,但終究還是會倒下去;這也就是微調(diào)的極限。
在某些場景下,是可以用手的:把業(yè)務(wù)中沒有用到的數(shù)據(jù)庫功能都去掉;甚至,去掉完整的ACID支持。
這樣一來,數(shù)據(jù)庫的性能就可以有數(shù)量級的改善了。
===== 關(guān)鍵在于靈活性 ====
最后,上面兩點,其實都是跟性能相關(guān)的;關(guān)系型數(shù)據(jù)庫即便作為通用方案,它的性能有極限,但也能夠滿足絕大多數(shù)應(yīng)用場景了。關(guān)系型數(shù)據(jù)庫的軟肋,是在靈活性上。
數(shù)據(jù)庫有表、而表有結(jié)構(gòu);而表的結(jié)構(gòu),在應(yīng)用上線之后,很難修改。
這同樣造就了一些專業(yè)學(xué)問:嚴密的業(yè)務(wù)分析、設(shè)計數(shù)據(jù)庫結(jié)構(gòu)、如何在數(shù)據(jù)庫上線之后修改結(jié)構(gòu)等等。
這些問題或者說學(xué)問之所以存在,是植根于關(guān)系型數(shù)據(jù)庫表結(jié)構(gòu)不靈活的前提之上。
再次”Think out of the box“,如果數(shù)據(jù)庫可以做到靈活、隨時修改的表結(jié)構(gòu)呢?
====== NoSQL ======
關(guān)系型數(shù)據(jù)庫的三個問題,被NoSQL全部解決了。
(同樣的,所有事情都有它的代價;NoSQL在解決SQL固有問題的同時,也引入了新的問題;另一方面,NoSQL解決的也不僅僅是SQL的這三個問題。)
ED要寫爛SQL?沒有關(guān)系,徹底不讓他們寫SQL好了。
數(shù)據(jù)庫支持功能太多?砍功能還不容易么?
Schema不靈活?那就schema-less好了。
目前,NoSQL的實現(xiàn)方案很多,MongoDB、Redis、Carssendra等等等等;每一個都可以非常不同,是專用解決方案:有自己獨有的特性,去解決特定場景的特定問題。
(當(dāng)然,像MongoDB,已經(jīng)很有NoSQL通用解決方案的意味了。)
普通程序員用SQL,文藝程序員用NoSQL,2B程序員把NoSQL當(dāng)SQL用。
普通程序員在從SQL切換去NoSQL時,會受固有的SQL知識限制,總有把NoSQL當(dāng)成SQL去用的沖動,但這是非常2B的行為。
從微觀的角度講,原來SQL查詢中所支持的各種神奇joining / groupby都不見了;拼命的想要去找在NoSQL數(shù)據(jù)庫環(huán)境下同樣的神奇工具。
這徹底違背了使用NoSQL的初衷:為了就是不讓你濫用SQL的這些神奇功能。
濫用SQL會造成嚴重的性能問題,而在性能問題浮現(xiàn)之后,需要耗費更大的力氣去糾正。
是的,信用卡透支購物很方便;但付賬單的時候就傻逼了;所以,換成無法透支的借記卡。
固然沒有了透支的便利,會有不方便,但徹底杜絕了還不起賬單,被收取高額利息的問題。
要透支的便利?ED,請先去掌握好理財技能,徹底了解透支的影響,然后我們再來談便利。
從宏觀的角度講,會有人企圖去給NoSQL做封裝,讓NoSQL表現(xiàn)得跟SQL一樣;甚至,去把NoSQL去掉的那些SQL功能加回去。
SQL已經(jīng)是一個非常非常成熟的方案,它所能夠解決的問題范疇里面,幾乎沒有辦法做得比SQL更好。
在NoSQL的基礎(chǔ)上,去試圖模擬SQL,只能成為SQL的蹩腳模擬;還不如直接用回SQL。
在網(wǎng)路編程里面也有類似的例子,TCP跟UDP??梢园裇QL看成是TCP,它是可靠、神奇的。UDP雖然不可靠,但是會比TCP更快。要做視頻、語音通訊,UDP是更好的選擇。但要去做“不丟包、不失幀”的可靠視頻通訊,選擇在UDP的基礎(chǔ)上添加確認、重發(fā)機制模擬TCP,那就是2B了。不是天才,沒法做得比TCP更好,直接用TCP就好。
作業(yè):
1. NoSQL的方案,如MongoDB還解決了SQL的什么問題?
2. NoSQL的應(yīng)用場景有啥米?
系列:
- 宅男程序員給老婆的計算機課程之0:認清本質(zhì)
- 宅男程序員給老婆的計算機課程之1:認清實際
- 宅男程序員給老婆的計算機課程之2:怎么看待牛人
- 宅男程序員給老婆的計算機課程之3:架構(gòu)比較
- 宅男程序員給老婆的計算機課程之4:SQL vs NoSQL
【編輯推薦】
- PHP+MySQL應(yīng)用中使用XOR運算加密算法
- 保證你從來沒見過的算法的舞蹈(視頻)
- 淺談PHP 5中垃圾回收算法的演化
- JavaScript版幾種常見排序算法分享
- 程序員須知的二十世紀最偉大10大算法
當(dāng)前名稱:宅男程序員給老婆的計算機課程之4:SQL vs NoSQL
本文來源:http://m.fisionsoft.com.cn/article/coegpsg.html


咨詢
建站咨詢
