从知乎了解到,为什么Mysql禁用存储过程、外键和级联?
打開帖子直接一張醒目的圖,是阿里巴巴的Java開發(fā)手冊對Mysql相關(guān)的要求。
看看下面的回復(fù)
靈劍
存儲過程沒有版本控制,版本迭代的時候要更新很麻煩。存儲過程如果和外部程序結(jié)合起來用,更新的時候很難無感升級,可能需要停服。存儲過程不利于將來分庫分表。存儲過程的功能不一定夠強大,業(yè)務(wù)擴展之后可能會發(fā)現(xiàn)無法繼續(xù)用存儲過程實現(xiàn)了。存儲過程可能無法和許多中間件、ORM庫一起使用。某些特殊的兼容MySQL的實現(xiàn)可能根本就不支持存儲過程,那就更不用說了。這也不絕對,在微軟的時候就有項目是反過來的,所有業(yè)務(wù)都需要用存儲過程寫在SQL Server里面,查詢?nèi)珜懗梢晥D,業(yè)務(wù)代碼只允許使用視圖和存儲過程,只要SELECT和EXECUTE權(quán)限就夠了;修改業(yè)務(wù)只需要登服務(wù)器改存儲過程。這屬于思路不同。 吳啊
任何技術(shù)都要分使用場景,阿里這種互聯(lián)網(wǎng)高并發(fā)的場景,很多數(shù)據(jù)都是分庫分表的,而且要求高度可擴展,原則是對db的保護做到最大化,能減少db壓力的就減少db壓力,盡量把運算邏輯拉到代碼里面。存儲過程的優(yōu)點在于封裝性好,直接讓db進行運算,但是缺點在于難以維護,而且大大增大db壓力。所以開發(fā)過程中禁止使用存儲過程也是阿里多年經(jīng)驗積累出來的。
?
孤盡[《阿里巴巴JAVA開發(fā)手冊》主要作者]
解釋一下這個事情:曾經(jīng)寫過近1200行的存儲過程,沒有辦法斷點,下層數(shù)據(jù)結(jié)構(gòu)只是稍微變動,根本無法找到出錯點,只是提示一下說:ERROR:1064啥的。在數(shù)據(jù)庫遷移的時候,由于數(shù)據(jù)庫版本變更,居然存儲過程無法執(zhí)行。另外,業(yè)務(wù)上需要擴展一下,那就是災(zāi)難性的啊。沒想到,我覺得毫無爭議的這一條,反而成了一個最大的爭議點。存儲過程只是單機時代的產(chǎn)物,并不適合互聯(lián)網(wǎng)時代。
?
陳曦
小公司還好,大公司對db把控很嚴格。分別說下:調(diào)試:線上調(diào)試一般就是打日志,在應(yīng)用層,日志可以在任何一步打,但是存儲過程的話,日志沒法跟蹤詳細的執(zhí)行過程。擴展:譬如你的 產(chǎn)品購買流程 要增加一個動作,這時候就要修改存儲過程到db里,你這時候要直接操作db,而在大公司,直接操作db只能有dba來進行,其他都要審批后使用公司自己開發(fā)的工作來進行,且只能是簡單的crud。移植:你用mysql寫的存儲過程,到了sqlserver不一定能直接用。但是在應(yīng)用層的話,程序里的crud的基礎(chǔ)sql基本上通用的,修改下連接串一般就ok了。
?
........
原貼地址:知乎地址
轉(zhuǎn)載于:https://www.cnblogs.com/wt645631686/p/8381333.html
總結(jié)
以上是生活随笔為你收集整理的从知乎了解到,为什么Mysql禁用存储过程、外键和级联?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JS实现sleep()方法
- 下一篇: 合作开发工具——freeze和pipre