业务逻辑实现方式的讨论:存储过程 good or bad?

之前国内外都对存储过程的好与坏进行了激烈的争论,以下是一些调查与讨论的链接,有兴趣可以去了解一下:

 

本文将不讨论这部分内容,更重要的强调什么情况下使用存储过程,什么情况下应该封装在业务类中。
总体的原则:
1、业务逻辑需要进行复杂的判断处理使用业务类实现
2、涉及小数据量(数据行在200条以内)处理判断使用业务类实现
3、涉及批量数据处理使用存储过程实现(如部门人员批量合并,同时批量增加每个人员的岗位变更信息子表)
4、涉及统计分析部分的逻辑通过存储过程来实现
5、如果需要对外提供数据层接口的部分通过存储过程实现,不建议直接开放数据表,至少也要以视图的形式开放(这种情况很少,一般是内部系统间才会使用这种接口,建议少用)
6、需要进行横向扩展的业务使用业务类实现(如:用户认证表只是纵向扩展,只是记录的增加;企业的数量可能的增长就属于横向扩展或者说模块的数量增长也属于横向扩展,涉及数据表的增加部分)
 
当然在大多数情况下,需要具体情况具体分析,以下只是针对我目前项目情况的分析:
1、只支持Oracle数据库。即Oracle10g及以上版本的数据库。因为是做SAAS服务,所以客户不需要关心数据库,为此产品没有适应多种数据库环境的需求。
2、模块低耦合。如用户认证、注册、具体业务逻辑模块应用等进行物理上的分离,提供的数据库存储及服务都分布在不同的数据库服务器或者实例上。
3、对可扩展性要求比较高,要求可进行多种方式的扩展(如部署方面可以通过横向增加服务器的方式解决高并发的问题,业务方面要求可以适应不断增加的功能模块,以适应企业管理的需要)。
4、对可靠性要求比较高,要求可提供7*24不间断服务。
 
总结:
通过Web服务器部署业务逻辑层的执行在横向扩展性能方面存在很大的优势。但在某些方面还是存在一些问题,同时也要考验开发人员的水平与代码的质量,对需求变更的适应性及响应的及时性等等方面。Oracle本身提供了一些数据库负载的解决方案,虽然我不是OracleDBA,但Oracle在数据库方面的成就还是非凡的。据我所了解的情况,发现数据库存在瓶颈的时候,除了优化一些SQL语句的执行效率之外,最先要做的就是数据库的读写分离,大大减少对IO资源的压力。在其它方面应该还有一些解决方案,至少之前在电信、电力、税务等大型应用下Oracle数据库本身并没有存在很大的问题(可能是DBA都解决掉了吧)。而在我的经验中大部分出问题的反而是程序本身,一方面是比较难快速的适应需求变更,另一方面是比较难定位问题。后者很大的原因是没有做好单元测试,造成问题定位困难,造成测试跟踪起来太麻烦。
posted @ 2010-08-04 11:20 小草 阅读(2338) 评论(23) 编辑 收藏

 回复 引用 查看   
#1楼2010-08-04 11:27 | 麒麟      
支持sp。
 回复 引用 查看   
#2楼2010-08-04 11:31 | Arthas-Cui      
把一个技术的好坏用bool值来衡量,
那么这个命题本身就有问题。只会引发大量的争论。

如果用一个double值来衡量, 是正还是负?
正多少?负多少?

或者什么时候是正的?什么时候是负的?

这才有讨论的意义。

 回复 引用 查看   
#3楼2010-08-04 11:37 | 金色海洋(jyk)      
各有各的优缺点,“在大多数情况下,需要具体情况具体分析”,这句话说的很对。

当遇到具体问题的时候,用什么来解决就很明显了。

 回复 引用 查看   
#4楼2010-08-04 11:46 |       
bad

在大多数情况下不使用

 回复 引用 查看   
#5楼2010-08-04 11:47 |       
等你顾客发现oracle的费用太高,说不定就头脑发热要换sqlserver了。

不过如果是政府、军队背景,另当别论。

 回复 引用 查看   
#6楼2010-08-04 11:49 | Assion Yang      
除非性能要求小范围的处理用SP,一般不建议把业务放在SP中。
 回复 引用 查看   
#7楼2010-08-04 12:09 | assiwe      
能不用存储过程就不用存储过程.只有用程序性能实在不行时才用
 回复 引用 查看   
#8楼2010-08-04 12:39 | thestarmm      
#2说的是.LZ也分析到位.
筷子和汤勺,每个都能独挡一面,但是有吃面条的时候,也有喝汤的时候,尽管都可以吃到,但是那个更适合大家也明白.

 回复 引用 查看   
#9楼2010-08-04 13:28 | mmyijia.com~      
各有长处
 回复 引用 查看   
#10楼[楼主]2010-08-04 14:28 | 小草      
@Arthas-Cui
标题只是一个噱头,看来还是挺吸引人的,不好意思。

 回复 引用 查看   
#11楼[楼主]2010-08-04 14:31 | 小草      
@
性价比是一个需要参考的指标,如果多投入,可以多产出的话,自然可以多投入,主要还是要看应用的项目情况。对于大型的应用我还是相信Oracle。借用三年前Oracle人的一句话:mssql只是小学毕业,oracle已经本科毕业了。

 回复 引用 查看   
#12楼2010-08-04 14:36 |       
@小草

小学毕业?lz千万不要中毒太深啊。被一知半解的人忽悠会很惨的。至于为什么是忽悠,可以看看IBM如何忽悠别人买他超级贵而且后期维护费也添加的服务器吧。

话说2个我都用过在项目里。

真要说oracle有什么牛逼指出,估计在“让你砸了100w以上之后,oracle的工程师会告诉你只要再砸500w配个oracle的xxx解决方案,就能够把你现在的问题瓶颈全部解决”

 回复 引用 查看   
#13楼2010-08-04 14:37 |       
如果自己有时间,就自己去实现数据库的性能优化吧。facebook这些就这样过来了,如果fackbook那块内存数据库拿出来卖估计也上百万了。
 回复 引用 查看   
#14楼2010-08-04 15:24 | 杀死鼻儿      
LZY941250
 回复 引用 查看   
#15楼2010-08-04 15:28 | kiler      
用sp怎么做版本控制,怎么做重构?
sp能做的没有什么C#不能做。

 回复 引用 查看   
#16楼2010-08-04 16:50 | thestarmm      
#15
版本控制你可以把脚本保存为本地文件就可以啦,不知道这个是不是你想要的.
-DB Script
-Table Schema
- xxxxxxx.sql
-...
-Stored Procedure
- xxxxxxx.sql
-...
然后,你也知道

 回复 引用 查看   
#17楼2010-08-04 19:01 | henry      
对我来说写C#比写PS方便维护和管理,原因很简单我熟悉C#和SQL但并不了解数据库的其特性.因此我自然很有信心的用C#写出来的东西比用PS好.同样在项目应该用什么很大程度上和决策者对那种工具了解有关系.
对一工具来说你用不好并不代表别人用不好,你写出来不好维护并不代表别人写出来不好维护就这简单.



 回复 引用 查看   
#18楼2010-08-04 21:31 | 雨后出太阳      
现在还说SQL server是 小学级别的,那真是无语了
 回复 引用 查看   
#19楼[楼主]2010-08-05 00:20 | 小草      
@雨后出太阳
呵呵,了解比较初浅。我也备注了一下是几年前的事情了,当然不排除跳级的可能性。

@henry
确实两种方式都可以实现,但我觉得还有各有优势与适用的地方。我的目的就是要把适用的情况分析出来,让各自的优势发挥出来。

 回复 引用 查看   
#20楼[楼主]2010-08-05 00:23 | 小草      
@kiler
同意楼上对于版本控制的说法,而且我现在也是这么做的。对于版本控制就是一种方法的问题。同时我们还做了一个数据库脚本升级的脚本,都有详细的版本控制,有点类似动网论坛的升级程序那样子,所以的数据表结构升级、初始数据升级等都有相关的脚本。另外我还写了一个批处理来批量对Oracle存储过程的脚本进行加密,以及批量进行更新升级,即做到了“一键式”更新。前提是要把脚本的编写规范化。

 回复 引用 查看   
#21楼2010-08-05 10:31 | kiler      
引用小草:
@kiler
同意楼上对于版本控制的说法,而且我现在也是这么做的。对于版本控制就是一种方法的问题。同时我们还做了一个数据库脚本升级的脚本,都有详细的版本控制,有点类似动网论坛的升级程序那样子,所以的数据表结构升级、初始数据升级等都有相关的脚本。另外我还写了一个批处理来批量对Oracle存储过程的脚本进行加密,以及批量进行更新升级,即做到了“一键式”更新。前提是要把脚本的编写规范化。


版本控制可以是可以这么凑合,sqlserver甚至支持数据sp直接版本控制,重构呢,我现在做的项目敢随便增加修改数据库字段,改字段名,存储过程的项目敢吗,至少sqlserver是不能这么折腾的。

sp设计出来的初衷就是处理数据查询的,硬要他做业务逻辑,做出来的东西只能是很别扭的。

很多人用多了sp就喜欢把一些C#很容易实现的东西用sp来写,比如日期计算,字符串拆分。这么搞来搞去最终使用sp性能也没有什么优势了。

 回复 引用 查看   
#22楼2010-08-06 11:18 | 永远的阿哲      
看来跟业务更有关联的都发在程序中
跟数据更有关联的放在SP中,比如导数据,数据调整,统计分析,报表等

 回复 引用 查看   
#23楼2010-08-09 14:17 | postman      
引用kiler:
用sp怎么做版本控制,怎么做重构?
sp能做的没有什么C#不能做。

遇到复杂业务逻辑需要对数据进行批量处理的时候,存储过程无疑是最好的实现方式。