2011-04-26 54 views
2

當我第一次進入數據庫時​​,我正在使用SQL Server。我最初用傳統的ASP進入了它。我們被告知的一件重要事情是,如果您使用存儲過程,而不是使用ASP SQL命令(我認爲這樣做),那麼您在SQL事務中節省了大量時間。所以幾乎所有我想要用數據庫編寫存儲過程,然後從我的代碼中調用存儲過程。在MySQL中存儲函數 - 值得嗎?

無論如何,快進幾年了,我現在正在用PHP和MySQL(以及一個小Python)來完成我所有的工作。有一件事我看起來似乎沒有多大意義,那就是使用存儲過程/函數的人,所以我並沒有真正擔心它。

但是,我發現我只是做錯了,並沒有意識到它。在MySQL中使用存儲函數有什麼主要優勢?我正在構建一個處理大量對數據庫的調用的相當大的網站。這些調用都是在我的PHP代碼中完成的。我會更好地使用存儲的函數進行一致的調用,然後將變量傳遞給PHP中的函數?

回答

4

嗯,這要看情況。存儲過程是處理功能分解的一種方式,如果您有多個應用程序與同一個數據庫進行交互,那麼它是絕對必要的。使用存儲採購的想法在幾年前處於領先地位,隨着全球已經轉向服務/ RAD世界,他們正在失去一些地位。

一些存儲過程的好處是

  1. 重用/這當然可以你的代碼庫中完成,但它打敗了地獄編寫相同的查詢10次加入15倍

  2. 安全 - 當sp是憤怒的SQL注入攻擊前來和減少您的曝光的一種方法是提供參數化SP,在大多數情況下,自動輸入消毒

  3. 按照定義在真正大型數據庫表格佈局上的文檔並不總是足以解釋您正在存儲的內容以及SP爲什麼並且有時會給您和那些在您之後產生的內容

  4. 定義的接口。

我認爲所有這些專業人員都可以提供假設良好的應用程序設計,並且只在某種程度上使項目具有一定程度的場景。

一些缺點

  1. 冗餘功能 - 我已經看到了很多商店,其中商業和CRUD邏輯在應用程序和業務邏輯的傳播是在數據庫中。

  2. 缺乏對SP的配置管理 - 雖然已有用於代碼SP管理的已建立的程序和工具遠遠落後。

+0

「幾年前」?我已經看到他們多年來一直在衰落。 – Xailor 2011-04-26 18:24:30

0

我的理解是,存儲過程和從您選擇的語言中準備的語句通常在計算上是等效的。

不管我如何應對,這是已被打死亡之前(在這個非常的網站)聖戰問題:MySQL Stored Procedure vs. complex query

0

這是問同樣的問題,「我要打破我的代碼插入方法/功能/過程,並呼籲他們,或者我應該一切編碼到我目前的功能?」

一些存儲過程給你的優勢:

  1. 更容易的測試。您可以在不運行應用程序的情況下測試存儲過程。
  2. 更容易開發。您可以讓數據庫開發人員編寫存儲過程和GUI開發人員編寫UI等。
  3. 更輕鬆地移植到不同的數據庫。所做的更改都包含在數據庫中,並且與應用程序的契約(傳遞給存儲過程的參數)不應更改。
  4. 能夠從多個前端使用存儲過程中的邏輯。您無需在每個需要創建新客戶的應用程序中編寫相同的客戶創建邏輯。

最大的缺點是你必須學習多個外形,可能使用多種工具。這是在.Net中使用Linq for SQL的一個重要原因。您不必學習SQL,並且所有內容都包含在.Net代碼中。

我們對所有東西都使用存儲過程。它工作得非常好。抽象是你的朋友。

+0

我認爲還有一個缺點:可伸縮性。數據庫可能是體系結構最難擴展的部分。它可以完成,但比添加更多PHP或Java服務器更具挑戰性。因此,如果可擴展性是一個問題,您可能需要平衡您的業務邏輯放入數據庫服務器的多少,以及如果在Web /應用程序服務器之間擴展的話可能會更好地擴展。 – Marvo 2011-04-26 18:09:58

+0

版本控制怎麼樣?如果SQL位於源代碼內部,對SQL的更改將存儲在源代碼庫(SVN,CVS等)中。 – Michael 2011-04-26 18:23:02

+0

Michael,我們的所有存儲過程源代碼都在TFS中。如果SQL存儲在應用程序的源代碼中,那麼管理更容易。 – 2011-04-26 19:57:25