2015-02-12 113 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访问!