2015-02-12 116 views
2

我在MVC中創建一個Web應用程序的體系結構。網絡應用程序將維護電子商務種類的數據。兩種方法之間幾乎沒有引起混淆,sql存儲過程vs代碼,哪一個更好?

  1. 我應該保持的計算/數據訪問的所有代碼中類文件(模型)這將在使用EDM用於訪問數據。通過EDM訪問數據將通過MODEL文件中提供的代碼和控制器訪問來完善。在這種方式下,我將不得不創建只有幾個模型,休息模型將由EDM創建,並可以直接綁定到視圖。

  2. 我應該保持的計算/數據訪問的所有代碼存儲過程將會使用SQL來訪問數據的查詢。這個訪問的數據通過存儲過程中的SQL查詢將直接使用 MODEL文件中提供的代碼和控制器訪問。在這種方法中,我將不得不創建許多模型因爲我將不得不設置STORED過程的參數。

在此問題出現,

  • 哪種方法是最好的客戶端,第一或第二?爲什麼?

  • 這兩種方法之間會有什麼性能差異嗎? 如何?

  • 哪種方法更快實施?

  • 哪種方法更安全?

謝謝,提前。

回答

9

哪個最適合客戶?讓我們回答最後一個問題。

性能:

簡而言之,它不會有性能差異。在過去的SQL版本中,查詢引擎會優化存儲過程,但不是特別查詢。 SQL的當前版本沒有區別。 SQL會盡可能存儲每個執行計劃(存儲過程或不存儲過程),如果可以的話,它將重用它。 專業提示 - 儘量不要讓where子句太瘋狂,SQL可以更容易地重用它。有時寫一些簡單的查詢比編寫一個大型的查詢更好。但是這是一個有很多因素的大話題!

更快的實現:

這很容易。我已經完成了過去12年的兩種方法,毫無疑問編寫存儲過程需要更多的勞動力。它也可能導致許多錯誤,因爲它是保姆的一層。如果客戶允許我避免存儲過程,我會將報價降低10%。但許多客戶堅持我使用它們。

這使我們... 更安全:

存儲過程更安全,這是爲什麼。通過存儲過程,您只需將一個角色授予SQL日誌 - 存儲過程的執行權限。當然,你可以做很多傷害,但它仍然有限。通過臨時查詢(如Entity框架),您必須直接授予對錶的完全讀寫訪問權限。

這種區別曾經與我一起體重,在數十家公司的幾十個項目之後購買,我真的不在乎做出這種微妙的區別。如果你被黑客攻擊並且他們可以直接訪問你的SQL以及你的用戶名和密碼,那麼這種權利差異就不是問題。

我的觀點是,避免存儲過程會一樣快,使您的代碼更快,並不顯着不安全。

+0

你會選擇哪種方法?爲什麼? – 2015-02-12 09:30:15

+1

如果可以的話,我會避免存儲過程(出於上述原因)。如果客戶要求它,我只會使用存儲過程。一個例外是我會使用存儲過程(或視圖)來處理非常複雜的報表。 – jlibertor 2015-02-13 17:17:29

0

雖然單元測試可以在procs上完成(通常附加在數據庫上),但我還沒有在單元測試的地方工作。我知道大多數DBA都恨數據庫附加組件。這也帶來了源代碼控制的重點。雖然存在用於源代碼管理的附加組件,但大多數組件並不這樣做。所以源代碼控制比「正常」代碼稍微痛苦一些。這並不壞,但它通常也不是完整的。

我認爲ORM真的讓編碼人員更輕鬆地將sql帶出proc並進入(希望)web服務。使用Web服務獲取數據的一個好處是遠離數據庫的抽象(現在可以支持多個數據庫用於您的產品)並緩存數據變化不大的數據。這導致了DBA的愛,巨大的性能改進和更可預測的DB訪問!