自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么阿里要禁止使用存儲(chǔ)過(guò)程?

存儲(chǔ)
最近項(xiàng)目中遇到的存儲(chǔ)過(guò)程問題,讓我想起了去年出差時(shí)一位同事的發(fā)問:我覺得存儲(chǔ)過(guò)程挺好用的,為什么你不建議用?

之所以有這個(gè)題目,我既不是故意吸引眼球,也不想在本文對(duì)存儲(chǔ)過(guò)程進(jìn)行教科書般論述。

[[406051]]

最近項(xiàng)目中遇到的存儲(chǔ)過(guò)程問題,讓我想起了去年出差時(shí)一位同事的發(fā)問:我覺得存儲(chǔ)過(guò)程挺好用的,為什么你不建議用?

當(dāng)時(shí)我好似胸有萬(wàn)言,但終究沒用一個(gè)實(shí)在的例子回答同事,只是從結(jié)論上大侃一通,代碼相對(duì)于 SQL,復(fù)用、擴(kuò)展、通用性都要更強(qiáng)。想必同事并不信服。

現(xiàn)在想來(lái),我最近正碰到的問題,算是一個(gè)可以回答同事的例子吧。

最近項(xiàng)目中有個(gè)新需求,需要校驗(yàn)一個(gè)用戶是否有 Job,Certification,Disclosure 這三個(gè)業(yè)務(wù)數(shù)據(jù)。

翻看了代碼發(fā)現(xiàn),系統(tǒng)的用戶個(gè)人頁(yè)面的 C# 代碼調(diào)用了三個(gè)存儲(chǔ)過(guò)程,去抓取用戶的 Job,Certification,Disclosure 數(shù)據(jù)。

我的新需求,自然需要復(fù)用這三個(gè)存儲(chǔ)過(guò)程,否則:若每一處都寫一次抓取數(shù)據(jù)的業(yè)務(wù)邏輯代碼,若業(yè)務(wù)邏輯發(fā)生變化,難以追查和維護(hù)所有讀取 Job,Certification,Disclosure 的 SQL。

如果我在 C# 代碼中調(diào)用這已有的三個(gè)存儲(chǔ)過(guò)程,事情本該非??炀湍芙Y(jié)束。我也是這么做的。

但 code reviewer 認(rèn)為,我的需求中,并不需要 Job,Certification,Disclosure 這三個(gè)業(yè)務(wù)對(duì)象的數(shù)據(jù)。

我只是需要給定用戶是否有 Job,Certification,Disclosure 而已。

所以我應(yīng)將是否有無(wú) Job,Certification,Disclosure 的判斷邏輯寫在數(shù)據(jù)庫(kù),最終通過(guò)網(wǎng)絡(luò)從數(shù)據(jù)庫(kù)傳到 web 服務(wù)器的僅是 true 或 false,節(jié)省網(wǎng)絡(luò)流量,這樣最好不過(guò)了。

也對(duì)。除開網(wǎng)絡(luò)性能,從接口設(shè)計(jì)的角度講,接口的傳入和返回值,都應(yīng)是你本身需要的數(shù)據(jù),不應(yīng)帶有大量不需要或者需要 caller 去預(yù)處理的數(shù)據(jù)。

從接口語(yǔ)義表達(dá)就可知調(diào)用的目的,這樣代碼可讀性也會(huì)有大大提高。那就動(dòng)手改。但沒想到的是問題來(lái)了。

為了講述問題,我簡(jiǎn)化代碼,假設(shè)系統(tǒng)現(xiàn)有的存儲(chǔ)過(guò)程如下:

  1. CREATE PROCEDURE [dbo].[GetJobs] 
  2.     @PersonId int
  3.     @OrganizaitionId int 
  4.  ) 
  5. AS 
  6. BEGIN 
  7.   SELECT JobId,JobName,JobType FROM Job WHERE PersonId = @PersonId AND OrganizaitionId = @OrganizaitionId 
  8. END 

我在新的存儲(chǔ)過(guò)程中調(diào)用它,我需要獲得該 person 的 jobs 的數(shù)量,即 GetJobs 返回結(jié)果集的 count。

為了實(shí)現(xiàn)這一目的,首先想到的是使用臨時(shí)表,將返回結(jié)果集存入臨時(shí)表,再對(duì)其進(jìn)行 count(*) 的計(jì)數(shù)操作:

  1. CREATE PROCEDURE [dbo].[MyProc] 
  2.     @PersonId int
  3.     @OrganizaitionId int
  4.  ) 
  5. AS 
  6. BEGIN 
  7.   CREATE TABLE #Temp
  8.     PersonId int
  9.     OrganizaitionId int 
  10.   ) 
  11.  
  12.   INSERT INTO #Temp EXEC dbo.GetJobs 
  13.     @PersonId = @PersonId, 
  14.     @ParentOrgId = @ParentOrgId 
  15.  
  16.   SELECT COUNT(*) FROM #Temp 
  17. END 

這種辦法簡(jiǎn)單有效,但它存在嚴(yán)重的維護(hù)問題。未來(lái)如果被調(diào)用的存儲(chǔ)過(guò)程的返回結(jié)果集字段有變動(dòng),那么 MyProc 中的臨時(shí)表結(jié)構(gòu)也需要隨之變化。這是令人難以接受的。

那么將 MyProc 中的 INSERT INTO 換為 SELECT INTO 呢?很遺憾,答案是不行。SQL 本身并不支持這種用法。

給現(xiàn)有存儲(chǔ)過(guò)程 GetJobs 加 output 參數(shù)?本例中因?yàn)?GetJobs 已被其他多處代碼或 SQL scripts 調(diào)用,所以對(duì)現(xiàn)有現(xiàn)有存儲(chǔ)過(guò)程進(jìn)行改動(dòng)會(huì)有不小風(fēng)險(xiǎn)。

我搜遍網(wǎng)絡(luò),一位 MS MVP 的大神的文章幾乎總結(jié)了所有存儲(chǔ)過(guò)程之間傳遞數(shù)據(jù)的方法:How to Share Data between Stored Procedures。

他在文章中也無(wú)可奈何地說(shuō)道:

Keep in mind that compared to languages such as C# and Java, Transact-SQL is poorly equipped for code reuse, why solutions in T?SQL to reuse code are clumsier.

最終我沒能找到一種滿意的辦法,無(wú)奈之下我在新寫的存儲(chǔ)過(guò)程中將查詢 Jobs 的語(yǔ)句寫一了次。

存儲(chǔ)過(guò)程在很多場(chǎng)景時(shí)有其優(yōu)勢(shì),比如性能,但對(duì)于業(yè)務(wù)邏輯的通用方法,非常不推薦將其寫在存儲(chǔ)過(guò)程中,代碼復(fù)用、擴(kuò)展與客戶端語(yǔ)言比,相差甚遠(yuǎn)。

也許終究能實(shí)現(xiàn),但代價(jià)與風(fēng)險(xiǎn)比客戶端語(yǔ)言要高,得不償失。天知道還有沒有機(jī)會(huì)和那位前同事再討論這一話題呢。

作者:楊洋的圍脖啊

編輯:陶家龍

出處:segmentfault.com/a/1190000011138993

 

責(zé)任編輯:武曉燕 來(lái)源: Segmentfault
相關(guān)推薦

2022-02-22 12:51:39

存儲(chǔ)過(guò)程JavaSQL

2019-01-14 07:28:56

大數(shù)據(jù)云計(jì)算互聯(lián)網(wǎng)

2020-09-08 16:25:18

Apache BeancopyJava

2020-07-30 12:16:33

阿里巴巴Apache對(duì)象

2019-11-13 14:38:34

Executors阿里線程池

2021-10-27 20:54:24

分庫(kù)分表高并發(fā)

2020-09-22 11:40:53

BigDecimalequalsJava

2025-04-17 08:47:23

2018-02-08 10:47:19

存儲(chǔ)技術(shù)列存儲(chǔ)

2022-06-30 08:03:13

Prisma數(shù)據(jù)庫(kù)工具開源

2022-12-26 00:25:06

2015-05-25 15:31:56

C語(yǔ)言學(xué)習(xí)和使用 C 語(yǔ)言

2022-09-05 10:06:21

MySQL外循環(huán)內(nèi)循環(huán)

2011-07-13 10:00:46

2022-08-30 16:38:30

阿里巴巴JavaLog4j

2020-12-15 10:00:31

MySQL數(shù)據(jù)庫(kù)text

2020-09-14 09:47:56

Java開發(fā)類型

2013-03-12 14:30:09

Ubuntu操作系統(tǒng)

2015-08-06 10:14:15

造輪子facebook

2022-08-15 08:27:02

基站網(wǎng)絡(luò)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)