刚来公司不久,今天和项目经理争论了存储过程的事我认为:存储过程是一种很美妙的东西,写起语句来既轻松又流畅比如一个组合查询,如果写在宿主程序里,很多人就是拼接很长的SQL语句(实际上我们公司也确实这么做的)这样一来,程序显得罗嗦不美观,还有可能带来安全性问题,比如经典的口令验证代码漏洞就是如此,如果做在存储过程里,只要传递参数过去,就能轻松搞定,不需要多少废话,简洁又明了,这样,各司其职,只需要简单的语句和返回结果进行交互。项目经理不支持存储过程的理由: 1.难于维护 2 .业务逻辑应该在中间层做我的回答:对于1,我一直没弄明白为什么存储过程一定比宿主程序更难于维护对于2,我理论上和他保持一致的观点,但我同样也保持另一种观点,就是能在数据库里做的事就尽量在这里做除非 :
一:让数据库做的性能不如宿主程序做的好;
二:和数据库之外的数据进行交互;
三:和第三方数据集进行交互;当然,中间件的一个重要功能就是负载平衡,但如何不是特别频繁性的操作,还不如在数据库里做,何必非要固执地一定要全部做到中间业务层呢?欢迎大家发表意见
一:让数据库做的性能不如宿主程序做的好;
二:和数据库之外的数据进行交互;
三:和第三方数据集进行交互;当然,中间件的一个重要功能就是负载平衡,但如何不是特别频繁性的操作,还不如在数据库里做,何必非要固执地一定要全部做到中间业务层呢?欢迎大家发表意见
都有它自己的优点
说存储过程难维护,绝对是托词
存储过程一样可以写的清清楚楚,干干净净对中间层的执着也大可不必来抹煞存储过程可以保留中间层,但是实际的工作都是存储过程完成存储过程并没有干涉中间层的概念比如说你一个类本来是用sql来进行数据库交互那么我改用存储过程交互,你就说我这不是中间层了?没有必要这么教条吧
但也不能老是依靠存储过程,有些逻辑可以由存储过程或者中间层实现的,倾向于由中间层实现。
毕竟频繁的访问数据库服务器会导致性能的下降,而且数据库的开销比较昂贵啊。
还是你的方法比较有策略
中间层尽量短小!!
数据库的连接资源尽量早释放~
到底业务逻辑是由数据层处理(用sp),还是由中间层处理,这个要看程序的复杂程度,
如果使用的数据表很多,并且业务逻辑复杂,那么还用sp处理显然是不恰当的。另一方面,程序对数据的访问不外乎CRUD操作和Load操作,这些其实是可以共用的。
很简单的sql就直接写在代码里面拉
2.SP减少了程序的硬编译.
3.SP可以看成在数据库上增加一层.
1、SP如果用在复杂的查询或是业务报表时,是非常的不错。
2、SP毕竟是模块化的编程方式。
3、如果做三层架构的话,那么业务逻辑尽量的放在业务层,维护起来方便。
4、现在很多的服务器,即是做应用服务器,又是做数据库服务器的,对于简单的逻辑,即便是用SP,也未必有多大性能上的提升。
WEB项目中涉及到数据操作的也是通过存储过程完成,因为我觉得这样安全一下。
如果系统可能用到不同的数据库系统,就尽量不要存储过程,并且尽量的用标准sql,如果只是建立在单一的数据库系统上,那就无所谓了,各有各的优点。
但现在做的系统大多都要考虑系统的可移植性,所以本人的观点:尽量不要用存储过程,而是把处理放在中间层,项目中也一直是这么做的
在VS.NET中,是可以调试的~~
2.拼装SQL语句 不建议放进存储过程3.碰到类似简单 查询、删除、修改 之类 可以放进一个存储过程当中 表示对一个类的操作。
4.碰到需要处理事务,回滚等内容 建议放入存储过程
比如,只是一个简单的select count(*) from tables 就没必要用,另外存储过程是调用以后常驻内存的,对于一些不常用的语句,建议不用。另外,存储过程也不是维护简单或者难的问题,这要看你对存储过程的调用管理上是否做得好,比如,某个存储过程,需要多输出一个参数,那如果你的数据层的东西做得不好,就得到处去找,哪个地方使用了这个存储过程,然后一个一个去加参数。如果数据层做得好,直接改一个地方,那维护还是很方便的。存储过程对于处理复杂的数据表之间的逻辑是很有好处的,速度快,尤其是对需要经常调用的地方,比如一项操作,需要从数据里取出多种数据,那如果不使用存储过程的话,通过ado(ado.net)会要经过几次的操作,效率很低。另外,建议大家首先考虑的是系统的架构,在乎的是设计合理。设计上有问题,其他的东西都是白搭了,尤其是数据库的设计以及各种索引的建立维护等等。这些相对于是用存储过程还是直接用sql调用来说,标准的是西瓜和芝麻的关系。
效率是高点,维护真不方便,如有特复扎的,才用,对效率不是太大影响的,就SQL好
主要是考虑我们的客户都是大公司,这些公司都购买了不同的数据库版权
所以我们面临的是不同的数据库,可能是SQL SERVER ,ORACLE, DB2如果站在这个角度上看,SP确实不利于产品化但再看看.NET,它为数据库操作做了4组控件包,分别是SQLxxx, Oraclexxx, OLExxx, ODBCxxx如果为了兼容不同的数据库,那么程序代码中势必充满大量的条件编译指令实际操作起来似乎也是很恐怖的。总之,个人觉得,方案有很多种,采用哪种,只是一种选择程序员没有选择权,只有接受选择权,呵呵
中间业务层调用存储过程来处理,多少经典的例子都在用它
至于维护,再没有比在宿主程序代码中调试更糟糕的情况了另外有个疑问,你们的项目经理怎么也管这个?做好他自己
应该管的事情就好了
另外写到中间层里也是为了使系统架构更加清晰,这样也为了以后的扩展或修改打了非常良好的基础,也许在开发的时候你考虑到了效能与开发的难易程度,但是对方所考虑到的是扩展性和软件工程中的耦合度问题,这样做不是没有好处,可以让他手下的人,在以后修改系统需求的时候不用疲于奔命的去改写建立在低层之上的业务逻辑,众所周知DB的架构一般是不可撼动的,因为一旦改动将牵制全局,或许在没有做工程管理的时候你不会体会到这样该有多麻烦,当你做上项目经理的位置时,你就会感觉到了
可是作为一个公司,也要时时顾忌成本
不同的规模项目,人员组成也相应有所不同项目经理充当80%的高程,20%的本职,这种情况也是经常发生的
不知大家有什么高招,请指教!
虽然效率高,毕竟他不是面向对象的语言,
写复杂和多变的业务没有面向对象语言所带来的灵活。
我觉得不可以拿duwamish7和petshop来说明什么,因为他们的存储过程只处理简单的数据操作。
更何况这两个案例所表达的并不是这些。
这样看来, 可以将复杂的Sql实现写在sp体中, 可以达到类似COM的效果
同时一些简单逻辑, 可以在直接在sp中进行修改
而不用修改任何的程序代码,执行从新编译但是过于复杂的逻辑在sp中实现起来比较麻烦
极力期盼SQLServer2005的正式发布
-------------------------------------------------------------------------------------
其他的应用程序也因是追对数据库的业务逻辑而受益
比如前一阵有个项目
用delphi编写的,业务逻辑都在sp里
总公司用的是c/s,较远的地方采用了b/s结构
直接调用sp可是在b/s里省去了不少步骤,所以换个角度来说
这也是优点
至于数据库的可移植性,相信即使你在宿主程序里写业务逻辑
针对不同的数据库改变的地方也很多,并不是轻而易举的可以移植的
对于多人的工程,他的版本控制也不是太方便.
项目小的话,时间紧的话,考虑用sp
存储过程的确维护不方便,又不能调试,目前O/R m 技术已经比较成熟,没必要还把业务逻辑放到数据库来处理
对于报表问题,如果使用强大的报表引擎,使用面向对象技术应该比使用存储过程方便很多,我们目前项目中便大量使用存储过程,造成维护严重困难
对于MS的两个例子为什么使用大量存储过程,个人认为那时由于一旦使用MS技术,便将平台移置列如不考虑的范围中,因此,我认为使用MS的程序员的思维都是跟到MS走的,我也是做MS技术的,对次深有体会