您好,登錄后才能下訂單哦!
程序員與數(shù)據(jù)庫(kù)中的設(shè)計(jì)實(shí)例分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
個(gè)人對(duì)程序員是充滿無(wú)比的崇敬和敬仰的,這輩子沒(méi)做程序員是我最大的遺憾。他們創(chuàng)造這這個(gè)世界,的確是偉大的。
在程序開發(fā)的SQL 存儲(chǔ)過(guò)程中有這樣一個(gè)想法,就是我只要完成功能就可以了,的確,數(shù)據(jù)量小完成功能就好了,我可以將我的存儲(chǔ)過(guò)程寫成一個(gè) “方法論”,來(lái)回的調(diào)用,也可以將我的存儲(chǔ)過(guò)程,寫成一部 “韓國(guó)連續(xù)劇”,或者一部日本的“貞子”。
為何這樣說(shuō),因?yàn)樵谖议喿x過(guò)的存儲(chǔ)過(guò)程中,真的是有“貞子的”, 基本上都以完成功能為主,其他的,其他的剩下的都是“貞子”。
你見(jiàn)過(guò)一個(gè)存儲(chǔ)過(guò)程,從頭倒下,全部都是 insert into select ..case...when when join.... join where..... group by order by
你是否見(jiàn)過(guò)一個(gè)存儲(chǔ)過(guò)程中,充斥著 update ... set ..... where xxx exist (select ...........)
我估計(jì)你是見(jiàn)過(guò)的,并且在程序員的眼里, whatever ,你語(yǔ)句提供我這樣寫,我就可以這樣寫,而且我功能完成的不錯(cuò),我有什么問(wèn)題嗎?
下面就是某財(cái)務(wù)軟件公司設(shè)計(jì)的 “觸發(fā)器”
我也希望我在別人心目中是 NICE ,KIND , be a gentleman.
但我對(duì)這樣的程序設(shè)計(jì)和對(duì)數(shù)據(jù)庫(kù)根本就不懂的行的設(shè)計(jì),深表遺憾,如此設(shè)計(jì),等待著的是客戶的抱怨和甚至是憤怒。
和同事們針對(duì)此事,討論了一番,觀點(diǎn)一致,從邏輯的設(shè)計(jì),到代碼的形成,都只能持深表遺憾的情感和態(tài)度。因?yàn)槲覀兊目蛻艚^對(duì)不是, 心情平靜的,佛系的客戶,當(dāng)你的系統(tǒng)慢的要死的時(shí)候,他們必然換一張臉,回答到, 不是我的問(wèn)題喲,系統(tǒng)太慢,我都工作不了呢?
在費(fèi)勁心力后,最后得到就是這樣一個(gè)“回復(fù)”, 我想DEVELOPERS 的心情一定有上萬(wàn)只 “羊駝” 飛過(guò)。
可問(wèn)題是,開發(fā)的時(shí)候,如果你想到最終的結(jié)果,你還會(huì)做如下的事情嗎?
1 update 語(yǔ)句 后面跟一堆的條件,關(guān)聯(lián)表,并且在UPDATE之前就要耗時(shí)很長(zhǎng).
2 insert into select 語(yǔ)句,后面要跟一堆的各種表的JOIN ,各種的判斷,耗時(shí)很長(zhǎng)
3 不盡量避免游標(biāo)的使用,通篇的游標(biāo)+ 循環(huán)(還是在內(nèi)部)
4 一堆的 if else if else ,仿佛進(jìn)入了迷宮
5 在插入的端口,進(jìn)行極為復(fù)雜的TRIGGER 設(shè)計(jì)
終上所述,陷入了一個(gè)怪圈,數(shù)據(jù)庫(kù)的程序設(shè)計(jì)寫的就像一部 “韓國(guó) 108” 集的電視劇。
那怎么避免這樣的問(wèn)題
1 UPDATE 就好好的UPDATE 后邊別跟一堆的條件,UDPATE 一定要快,你可以將你需要的在UDPATE 后處理的判斷,先進(jìn)行一個(gè)select 將其格式化,變量化,等等,這并不是多難的事情,但你的客戶,就不會(huì)因?yàn)橄到y(tǒng)緩慢的運(yùn)行,將你推到 “懸崖”。
2 INSERT 請(qǐng)就好好的INSERT INSERT INTO 在大型系統(tǒng)里面不應(yīng)該被存在,如何處理見(jiàn)上
3 游標(biāo),如果實(shí)在沒(méi)有辦法,那就用,不頻繁使用沒(méi)問(wèn)題,否則祈求,客戶別投訴。
4 關(guān)于TRIGGER 的設(shè)計(jì),在很多系統(tǒng)都被禁用,當(dāng)然我們應(yīng)該具體問(wèn)題具體分析,但上面圖上那樣的ORACLE TRIGGER 設(shè)計(jì),我真的很無(wú)語(yǔ)。
那存儲(chǔ)過(guò)程里面為什么要存在臨時(shí)表,原因如下
,
1 復(fù)雜的多表查詢中,數(shù)據(jù)庫(kù)的優(yōu)化引擎在牛B ,他也有算錯(cuò)的時(shí)候,無(wú)論是因?yàn)榻y(tǒng)計(jì)數(shù)據(jù)的錯(cuò),還是語(yǔ)句寫法的錯(cuò),復(fù)雜的查詢,如果變成多個(gè)簡(jiǎn)單的查詢,都是沒(méi)有壞處的,那如何變成簡(jiǎn)單的查詢,承接中間的結(jié)果,自然是要用臨時(shí)表了。
2 臨時(shí)表可以在加索引,提高查詢的效率(部分?jǐn)?shù)據(jù)庫(kù)還有 內(nèi)存表)
3既然是臨時(shí)表,其中的結(jié)果集應(yīng)該不是很大,如果很大那就是另外一個(gè)話題了。
所以在大型系統(tǒng)中,請(qǐng)盡量將操作DML的操作與 SELECT 的操作分開,不要insert select , update select ,這樣不好,也容易帶來(lái)更多的問(wèn)題,和復(fù)雜的鎖。
關(guān)于程序員與數(shù)據(jù)庫(kù)中的設(shè)計(jì)實(shí)例分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。