看到《阿里巴巴java編碼規範》有這樣一條java
關於這條規範,我說說我我的的見解程序員
用不用存儲過程要視所使用的數據庫和業務場景而定的,不能由於阿里巴巴的技術牛逼,就視他們的手冊裏的每一項規範爲聖經, 盲目的去遵循。數據庫
對於手冊中的這項規範,我以爲使用MySQL的程序員認同佔多數, 而使用SQL Server的程序員反對佔多數。 緣由在於MySQL對SQL編程和複雜查詢性能優化的支持實在太爛。不過從手冊的上下文來判斷這條規範應該就是針對MySQL的。編程
記得MySQL支持存儲過程是5.0版本開始的, 那時候已是2006年了,而重新版本發佈到用戶全面升級,勢必要延遲幾年, 而同時期的Sql Server2005和Sql Server2008的Transact-SQL編程已經至關成熟,不是MySQL可以追趕的上的。 而業務邏輯這個東西,能夠放在SQL端實現也能夠放在語言端實現,偏偏MySQL對於SQL編程支持的不完善,形成使用MySql數據庫的程序員都偏向於把邏輯放在語言中實現,加上互聯網的蓬勃發展,MySQL使用場景愈來愈廣,此消彼長, SQL編程技術也就愈來愈不招人待見。性能優化
然而,這並不能代表SQL編程無可取之處。服務器
在微軟技術棧程序員中,存儲過程絕對神器級的解決問題手段,不論是存儲過程, 視圖、觸發器、自定義函數這些都是極經常使用的技術。而這些在MySQL中基本上是見不到的,在開發基於MySQL的項目中,要是有人膽敢使用此類技術,絕對會被視爲異端, 並絕不留情的遭受打壓。在微軟技術棧中,優先推薦將業務邏輯使用Transact-SQL編程實現,封裝在數據庫中, 供外部.Net程序調用。有的項目經過這種方式實現,外部的程序就是個空殼子,全部複雜的邏輯全在數據庫裏面。 拿MVC模式打比方,model層的內容全在數據庫裏, 程序中只剩Controller和View層的內容, 這會讓人產生一種編程語言沒鳥用的錯覺。 可是這樣作是有好處的。併發
首先,不少人說存儲過程性能不行,其實也不必定, 尤爲是Sql Server。大規模高併發分佈式場景下SQL編程不佔優點,可是並不是全部應用都是如此的, 在普通應用場景下,SQL編程的性能優點就體現出來了。 由於編程語言對數據庫的操做最終都會轉化爲SQL語句傳遞給數據庫執行, 那在具有優秀的SQL編程能力的狀況下,經過SQL編程實現業務邏輯顯然比經過程序語言實現更底層, 粒度更細, 和數據庫自己結合的更緊密,更利於性能調優。 雖然本來在程序端的計算量被轉移至了數據庫端, 程序端壓力小, 數據庫端壓力大, 可是二者相加的總壓力卻變小了,由於把邏輯放在程序端實現,沒法百發百的壓榨數據庫性能,從而致使資源浪費。 經過SQL編程實現業務邏輯, 數據庫壓力雖然大了,卻可把原來屬於程序端的服務器資源劃給數據庫端,這樣在整體上來講資源不但不浪費,並且還節省了。 經過數據庫實現業務邏輯的性價比更高。再者,大多數程序的業務邏輯無非是對數據庫的增刪查改,沒有誰比SQL更適合幹這個事情,包括編程語言,所以用SQL編程來實現業務邏輯最合適不過。 不要說什麼SQL編程不支持面向對象,沒法解決複雜問題,先不說大多數項目沒有到達複雜的程度, 如今主流的ORM框架的實現都是不符合理論的,誰說關係表能夠映射爲對象的,荒唐。何況,SQL語句面向結果編程符合的函數式編程模式,而函數式編程是現代編程界的一股清流,牛逼之處不言而喻。 即便真碰到什麼問題是SQL編程沒法解決的,也能夠把這部分問題提取出來經過程序實現, 但我相信這樣的問題老是佔少數的。框架
其次, 把邏輯封裝在存儲過程裏,有一個好處是改動方便。 改程序須要從新編譯、停服、發佈, 存儲過程是能夠熱更新的, 能減少發佈程序所帶來的影響。在以SQL Server爲基礎的程序中,光上面說的這些也足夠成爲用SQL編程實現業務邏輯的理由了。但在MySQL下是不成立的, 我曾經見過一個.net程序員強行把MySQL當SQL Server使,結果項目後期維護跟翔同樣臭。編程語言
這個Java手冊是從阿里巴巴的業務場景中提煉出來的, 照着它練能作出很厲害的項目來。可是在整個軟件開發行業,不是全部的企業都是互聯網公司, 即便在整個互聯網行業中,也不是全部的公司都是阿里巴巴,不是全部的項目都要應對巨量請求,不是全部的項目都使用MySQL數據庫。 誠然, 這個手冊的規則是正確無疑的,可就像韋小寶說的,跟小皇帝打架用的着花幾十年時間練化骨綿掌嗎,花幾小時練擠奶龍爪手就足夠了。 因此, 是否是用存儲過程仍是視實際狀況而定,一票否決是不明智的。分佈式
還有,那些說存儲過程難以調式難以修改的, 要不就是沒用對數據庫, 要不就是SQL編程能力不足。以我我的的經驗來講,存儲過程是個好東西,尤爲在SQL Server下。若是數據庫僅僅是用來當存儲數據的倉庫,那像Oracle、IBM、Microsoft用的着費勁把它們產品的功能作這麼強大嗎, 那些已故的數庫領域的先驅都要抱恨終天了。