15

這些軟件體系結構中的每一個在哪些域中發光或失敗?代碼生成器與ORMs與存儲過程

哪些關鍵要求會促使您選擇其中之一?

請假設您有開發人員可以完成面向對象的代碼以及良好的數據庫開發。另外,請避免神聖戰爭:)所有這三種技術都有優點和缺點,我感興趣的是哪裏最適合使用哪個。

回答

13

這些工具中的每一個都提供了不同的抽象層,以及覆蓋行爲的不同點。這些都是架構選擇,所有架構選擇都取決於技術,控制和組織之間的平衡,應用程序本身以及它將部署的環境。

  • 如果您正在處理DBA'統治雄風'的文化,那麼基於存儲過程的架構將更易於部署。另一方面,管理和版本存儲過程可能非常困難。

  • 當您使用靜態類型語言時,代碼生成器會發光,因爲您可以在編譯時而不是在運行時捕獲錯誤。

  • ORM是集成工具的理想選擇,您可能需要在安裝到安裝的基礎上處理不同的RDBMS和模式。更改一張地圖,您的應用程序將從與Oracle上的PeopleSoft合作到與SQL Server上的Microsoft Dynamics合作。

我見過其中生成的代碼使用存儲過程進行接口的應用,因爲存儲過程可以被調整,以避開在代碼生成器的限制。

最終,唯一正確的答案將取決於您嘗試解決的問題以及解決方案需要執行的環境。其他任何人都在爭論「馬鈴薯」的正確發音。

+0

謝謝您的回答! – Sklivvz 2008-09-20 06:55:39

+0

我知道這是一篇舊文章,但ORM的一個好處是,他們通常會管理開箱即用的緩存,如果您想要使用存儲過程,它就是PITA,因爲它是通過手動完成的。 – Augusto 2012-03-07 16:53:42

5

我同意一切都有優點和缺點,很大程度上取決於你的架構。這就是說,我嘗試在有意義的地方使用ORM。許多功能已經存在,通常它們有助於防止SQL注入(加上它有助於避免重新發明輪子)。

請參閱有關的話題這另外兩個職位(動態SQL VS 存儲過程VS ORM)瞭解更多信息

動態SQL與存儲過程
Which is better: Ad hoc queries, or stored procedures?

奧姆斯與存儲程序
Why is parameterized SQL generated by NHibernate just as fast as a stored procedure?

+0

您沒有回答我的問題... – Sklivvz 2008-09-16 20:24:31

3

ORM和c頌揚發生器在這個領域的一邊,存儲過程在另一邊。通常,在綠地項目中使用ORM和代碼生成器會更容易,因爲您可以調整數據庫架構以匹配您創建的域模型。將它們與傳統項目一起使用要困難得多,因爲一旦用「數據優先」的思維方式編寫軟件,就很難用域模型來包裝它。

這就是說,所有這三種方法都有價值。存儲過程可以更容易優化,但將應用程序本身可能重複的業務邏輯放入其中可能會很誘人。如果您的模式與ORM的概念相匹配,則ORM可以很好地工作,但如果不符合,可能很難定製。代碼生成器可以是一個很好的中間立場,因爲它們提供了ORM的一些好處,但可以自定義生成的代碼 - 但是,如果您習慣於更改生成的代碼,則會出現兩個問題,因爲您每次重新生成時都必須更改它。

沒有人真正的答案,但我更傾向於ORM方面,因爲我認爲以對象爲先的思維方式思考更合理。

2

存儲過程

  • 優點:封裝數據訪問代碼和獨立於應用程序
  • 缺點:可以是RDBMS特定,增加了開發時間

ORM

至少一些的ORM允許映射到存儲過程

  • 優點:文摘數據訪問代碼,並且允許實體對象域特定的方式
  • 缺點將被寫入:可能的性能開銷和有限的映射能力

代碼生成

  • 優點:可用於基於存儲的進程內碼或ORM或兩者
  • 缺點的混合:代碼生成層可能必須被保持在除了理解生成的代碼
10

我將添加我的兩分錢:

存儲過程

  • 可以很容易地優化
  • 摘要基本業務規則,提高數據的完整性
  • 提供良好的安全模型(無需授予讀取或寫入權限的前面臨db用戶)
  • 閃耀,當你有很多應用程序NS訪問相同的數據

奧姆斯

  • 讓你只集中在域擁有更「純粹」的面向對象的方法來發展
  • 服務,當您的應用程序必須是跨數據庫兼容
  • 當您的應用程序主要由行爲而不是數據驅動時發光

代碼生成

  • 爲您提供類似的好處的ORM,具有更高的維護成本,但具有更好的可定製性。
  • 一般優於在奧姆斯奧姆斯傾向於交易編譯時錯誤運行時錯誤,這通常是要避免的
2

你忘了自己專門的類別顯著選項:混合數據映射框架,如iBatis

我對iBatis感到滿意,因爲它讓您的OO代碼在本質上保持OO,並且您的數據庫本質上保持關係,並通過添加第三個抽象(對象與關係之間的映射層)來解決阻抗不匹配問題,這是負責繪製這兩者的映射,而不是試圖強迫適合另一種範式。