我正在听Hanselminutes播客; "StackOverflow使用ASP.NET MVC - Jeff Atwood和他的技术团队".在播客过程中,他们正在谈论SQL服务器,并说出"存储过程的日子已经过去"的内容.
现在我不是DBA,但这让我有点意外.我一直认为SP是速度的方式(因为它们被编译)和安全性,更不用说可扩展性和可维护性.如果不是这种情况而且SP处于最后阶段,那将取代它们或将来我们应该做些什么?
也许我太老了,太懒,或者两者兼而有之,但我不得不反对.一次又一次的存储过程"节省了一天",因为当出现次要的后端更改或错误时,我们只需要修复存储过程,而不是在几十个桌面和Web服务器上更新桌面应用程序.此外,用户不会中断.这节省了大量精力和用户的麻烦.
此外,一些数据库操作只会在服务器上更高效,而不是在网络中来回,尤其是.当一个存储过程调用另一个存储过程调用另一个存储过程时(有或没有游标)
编辑:在SOA体系结构中,update-the-client-apps问题得到了缓解(感谢maud-dib),但是相互调用的存储过程仍然比SOA层的多个网络往返更有效.并且更新SOA层也不总是微不足道的.
在现代系统上,参数化查询在服务器上进行编译和缓存,因此它们与存储过程一样快.它们具有大多数相同的安全功能.
对于为单个应用程序提供服务的数据库,将查询逻辑放在代码中的相关位置更有意义.如果没有别的东西,它可以更容易地进行源代码控制.如果你在服务器上保存存储过程,跟踪它们很快就会变得一团糟.此外,如果您使用的是ORM工具,那么无论如何您可能没有太多的实际SQL.
如果您的数据库服务于多个不同的应用程序,那么您可能仍希望使用存储过程在应用程序之间强制执行业务规则.
我会说SP不可维护而且它们不能扩展.询问任何必须为SP重型系统添加功能的开发人员.为什么在不同的层中有一半的逻辑?没有什么可以替代的,只是不要使用'em.
谷歌搜索这篇伟大的帖子.
我一直听说如果你有多个应用程序连接到数据库,或者它使错误修复更容易,SP是好的.
这就是服务层的用途!
业务逻辑进入服务层,应用程序逻辑进入应用程序/网站.
调试和维护数百个SP(尤其是生成的SP)比维护编写良好的代码通过ORM工具与DB通信更加困难.
如果您只关心速度,SP可能是要走的路.但是,如果您关心可扩展性或可维护性,SP可能不是最好的.我们的架构是建立在SP之上的,经过10年的代码,它很难维护并且非常多.一个好的ORM映射器可能是更好的选择.
可维护性 可能SP更好.如果维护SP的功能很难,那么在业务层组件中维护它们就更难了.
性能 缓存查询可能会对SP产生接近性能.但他们不能匹配的品种平台的跨品种数据库SP的性能.网络延迟是另一个值得关注的领域,尽管现在差距在缩小.
调试 SP可能比调试业务层+ db层放在一起相当容易.
使用SP可以有更多+ ve点.
但看节目的现代潮流,其相当"聪明"与"N"三层架构去大量的商业理由比"老" SP为基础的方法坚持.
好的系统应该兼顾两者.可能遵循80-20原则,20是SP.