2010-06-02 26 views
14

過去10年來,我一直在用SQL Server後端編寫asp.net應用程序。在那段時間裏,我也寫了一些PHP應用程序,但不是很多。PHP開發人員應該使用MySQL的存儲過程嗎?

我將把我的一些asp.net應用程序移植到PHP並遇到一些問題。在Asp.net世界中,人們通常會理解,在訪問任何數據庫時,使用視圖或存儲過程是這樣做的首選方式。

我一直在閱讀一些PHP/MySQL書,我開始覺得在MySQL中使用存儲過程是不可取的。我毫不猶豫地使用這個詞,這是可取的,但那只是我的感覺。

所以,我正在尋找的建議基本上,我是對還是錯? PHP開發人員是否使用存儲過程?或者,它是否被避開了?

回答

9

是否使用存儲過程更多的是在酒吧進行宗教或政治討論。
需要做的是明確定義您的應用程序層,而不是跨越這些邊界。與在數據庫之外進行查詢相比,存儲過程有幾個優點和缺點。

優點1:存儲過程是模塊化的。從維護角度看,這是一件好事。當您的應用程序出現查詢問題時,您可能會同意,對存儲過程進行故障排除要比隱藏在多行GUI代碼中的嵌入式查詢容易得多。

優點2:存儲過程是可調的。通過爲您的界面處理數據庫工作的過程,您無需修改​​GUI源代碼即可改進查詢的性能。可以對存儲過程進行更改 - 就連接方法,不同表格等而言 - 對前端界面透明。

優點3:存儲過程從客戶端抽象或分離服務器端函數。編寫GUI應用程序來調用過程比通過GUI代碼構建查詢要容易得多。

優點4:存儲過程通常由數據庫開發人員/管理員編寫。持有這些角色的人通常在編寫高效的查詢和SQL語句方面更有經驗。這使得GUI應用程序開發人員可以將他們的技能用於應用程序的功能和圖形演示文稿。如果你讓你的員工執行他們最適合的任務,那麼你最終會產生更好的整體應用。

考慮到這一切,有幾個缺點。

缺點1: 如果邏輯完全在存儲過程中實現,涉及廣泛的業務邏輯和處理的應用程序可能會給服務器造成過大的負載。這類處理的例子包括數據傳輸,數據遍歷,數據轉換和密集計算操作。您應該將這種類型的處理移動到業務流程或數據訪問邏輯組件,這是比數據庫服務器更具擴展性的資源。

缺點2: 不要把所有的業務邏輯放到存儲過程中。當您必須修改Sp語言的業務邏輯時,維護和應用程序的敏捷性成爲一個問題。例如,支持多個RDBMS的ISV應用程序不需要爲每個系統維護單獨的存儲過程。

缺點3: 編寫和維護存儲過程通常是一種並非所有開發人員都擁有的專業技能集。這種情況可能會在項目開發時間表中引入瓶頸。

我可能錯過了一些優點和缺點,隨時發表評論。

+0

謝謝羅曼和你們所有人。我非常感謝你的幫助。看起來我有一些計劃要做。 – 2010-06-03 19:12:10

4

也可能是因爲MySQL沒有得到存儲過程,直到5版本如果使用準備好的語句,你應該沒問題......只是不使用內聯SQL

0

存儲過程是 - 常 - 完全浪費精力。

如有疑問,實際測量性能。您經常會發現存儲過程會增加複雜性,導致無法識別的好處。您的SP可能沒有提升性能。

有些人認爲他們非常「重要」。實際衡量表現而不是狡辯或辯論至關重要。

3

幾年前,我最終爲PHP/MySQL項目編寫了相當數量(〜3K行)的存儲過程代碼。以我的經驗:

  • MySQL存儲過程可能不會幫助你在性能方面。
  • 通過使用MySQLi預處理語句執行SP可能會導致頭痛。
  • 可能很難抽象出常見的模式 - 我發現自己比我更喜歡重複自己。
  • 根據MySQL版本和配置,您可能需要SUPER特權才能創建SP。

如果您正在移植使用存儲過程的代碼,那麼保留它們可能是最容易的。當然可以在PHP和MySQL中使用它們,我不會親自稱它爲而不是。如果我從頭開始一個新的PHP項目,我可能不會選擇再次使用它們。

0

許多(大多數?)web應用程序使用數據庫抽象層來處理注入漏洞/等等。

如果你想爲自己的應用程序,請看看PDO。以下是有關如何使用它的一個很大的教程: http://www.devshed.com/c/a/PHP/Using-PDO-Objects-in-PHP-5/

+0

與pdos完全真正的存儲過程是偉大的。 – 2017-11-02 20:59:11

0

總的來說,我很討厭的存儲過程,因爲:

  1. 這太容易,不應該在那裏的業務邏輯下滑。
  2. 需要更新存儲過程的應用程序更新很難同步,特別是如果您必須恢復到以前的版本。

對於任何數據庫操作,我推薦使用PHP ORM框架,如http://www.doctrine-project.org或包含ORM(如CakePHP)的框架。您將能夠更輕鬆地在SQL Server和MySQL之間切換,從而獲得額外的好處。

1

怎麼樣SQL注入? 程序允許你做的WHERE子句參數調用,減少注射的危害

0

這裏是在MySQL存儲過程的平衡和知情的文章:http://www.linuxjournal.com/article/9652?page=0,0

解僱他們失控是「浪費時間「或者」難以維護「或者」沒有提供任何真正的益處「在任何數據庫和大尺寸的應用中都是非常不明智的。

相關問題