從知乎了解到,為什么Mysql禁用存儲過程、外鍵和級聯?


打開帖子直接一張醒目的圖,是阿里巴巴的Java開發手冊對Mysql相關的要求。

看看下面的回復

靈劍

存儲過程沒有版本控制,版本迭代的時候要更新很麻煩。存儲過程如果和外部程序結合起來用,更新的時候很難無感升級,可能需要停服。存儲過程不利於將來分庫分表。存儲過程的功能不一定夠強大,業務擴展之后可能會發現無法繼續用存儲過程實現了。存儲過程可能無法和許多中間件、ORM庫一起使用。某些特殊的兼容MySQL的實現可能根本就不支持存儲過程,那就更不用說了。
這也不絕對,在微軟的時候就有項目是反過來的,所有業務都需要用存儲過程寫在SQL Server里面,查詢全寫成視圖,業務代碼只允許使用視圖和存儲過程,只要SELECT和EXECUTE權限就夠了;修改業務只需要登服務器改存儲過程。這屬於思路不同。
 
吳啊

任何技術都要分使用場景,阿里這種互聯網高並發的場景,很多數據都是分庫分表的,而且要求高度可擴展,原則是對db的保護做到最大化,能減少db壓力的就減少db壓力,盡量把運算邏輯拉到代碼里面。存儲過程的優點在於封裝性好,直接讓db進行運算,但是缺點在於難以維護,而且大大增大db壓力。所以開發過程中禁止使用存儲過程也是阿里多年經驗積累出來的。

 

孤盡[《阿里巴巴JAVA開發手冊》主要作者]

解釋一下這個事情:曾經寫過近1200行的存儲過程,沒有辦法斷點,下層數據結構只是稍微變動,根本無法找到出錯點,只是提示一下說:ERROR:1064啥的。在數據庫遷移的時候,由於數據庫版本變更,居然存儲過程無法執行。另外,業務上需要擴展一下,那就是災難性的啊。沒想到,我覺得毫無爭議的這一條,反而成了一個最大的爭議點。存儲過程只是單機時代的產物,並不適合互聯網時代。

 

陳曦

小公司還好,大公司對db把控很嚴格。分別說下:調試:線上調試一般就是打日志,在應用層,日志可以在任何一步打,但是存儲過程的話,日志沒法跟蹤詳細的執行過程。擴展:譬如你的 產品購買流程 要增加一個動作,這時候就要修改存儲過程到db里,你這時候要直接操作db,而在大公司,直接操作db只能有dba來進行,其他都要審批后使用公司自己開發的工作來進行,且只能是簡單的crud。移植:你用mysql寫的存儲過程,到了sqlserver不一定能直接用。但是在應用層的話,程序里的crud的基礎sql基本上通用的,修改下連接串一般就ok了。

 

........

原貼地址:知乎地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM