MyException - 我的异常网
当前位置:我的异常网» 开发方法 » 多层体系结构(逻辑打包于逻辑层)VS 存储过程(逻

多层体系结构(逻辑打包于逻辑层)VS 存储过程(逻辑封装于存储过程)

www.MyException.Cn  网友分享于:2015-08-26  浏览:0次
多层体系结构(逻辑封装于逻辑层)VS 存储过程(逻辑封装于存储过程)
本人涉足企业信息系统开发近十年有余,也接触了许多大大小小的信息系统开发的项目。对开发中究竟是使用将逻辑独立分层以构建三层(或多层)体系结构还是将逻辑写在存储过程中有仍有许多疑惑:

1、许多介绍企业信息系统类的书籍,上来就否定将数据写在存储过程中的做法,主张将所有的逻辑都写在“逻辑层”中,不到万不得已,绝不使用存储过程,说是存储过程虽然开发简便快捷,执行效率高,但会产生许多冗余代码,不便于维护和管理,仅适合于小型系统的开发,在大型系统中不能使用。存储过程产生冗余代码这一点我承认,由此带来的维护和管理问题也的确存在,但是因此就封杀掉了存储过程,我觉得过于片面和主观了,毕竟存储过程带来的好处远大于其带来的麻烦(现在Oracle、DB2等数据库已经提供了对Java存储过程的支持,相信在不久的将来,上述的问题将可迎刃而解)。

2、都说存储结构不适合大系统的开发,但多大的系统才算大系统呢?在我所接触到的信息系统项目中,甚至包括一些业务逻辑和表结构都相当复杂的项目,绝大部分都是可以使用二层架构实现的,而且相较于多层架构有着更高的开发和执行效率。除了一些大量并发查询的场合,将逻辑独立分层能够降低服务器负担(事实上,对分布式数据库而言,使用存储过程带来的这些负担是可以接受的),许多系统的开发完全可以快捷地通过二层架构实现需求。

3、在现实的开发过程中,要开发者掌握各种多层体系架构中的技术(例如ORM,各种设计模式等)是需要付出许多学习成本的,构建一个结构复杂的面向对象系统往往会导致开发失败,项目夭折。而使用存储过程编写的系统则相对要简单得多,并且能够胜任大部分信息系统的开发工作。项目中的程序员大多水平参差不齐,越短的学习周期意味着越高的项目开发成功概率。敏捷开发的思想在于快速构建系统原型,使用存储过程进行二层结构开发能够很好地与敏捷开发方法相契合。

4、说到面向对象,就要谈到数据抽象、封装,我觉得为什么不把数据库也视作一个对象呢?数据和操作(即存储过程)都封装在这个对象的内部,对外只提供相应的接口就行了,为什么还要单独地设立一个逻辑层,引入ORM,割裂这一对象的完整结构?

5、数据库本身在存储过程上做了那么多文章,提供了多种利于编写存储过程的工具和方式。耗费了高昂的价格购买的数据库却只想着去使用它的数据存储功能,此外还要购买ORM产品去解决数据持久层的问题,这一做法是不是值得商榷?

6、谈到移植成本,虽然将逻辑写在外部更容易移植,但正如前面所说的,使用多层体系结构,引入各种分层技术,域模型的方法势必会加大开发成本,为什么不将这些成本延迟到移植发生时才产生呢?再者说,移植也是一件概率非常小的事件,保持资金的流动性不是更好么? 
 
   以上只是鄙人的一些见解和感触,望能与大家相互讨论,并期待众大神能够不吝赐教!
------解决方案--------------------
写这么多。。。。。我谈谈我的体会吧

存储过程使用SQL(T-SQL、PL/SQL等)语言,业务层使用OO语言(Java、C#等)。
两种语言的特性决定了它们的适用范围:
SQL语言的长处是二维数据的查询,对于复杂的业务模型控制起来力不从心,例如封装、继承、多态,这些SQL是估不到。
而Java、C#之类的语言可以灵活运用OO的特性(23种设计模式),处理起复杂的业务逻辑比SQL要方便不少。
但OO语言做二维数据的查询就不如SQL方便了。

其实SQL的全名“结构化查询语言(Structured Query Language)”,已经很好地诠释了SQL适用的范围。

我现在用DDD架构,查询用SQL,业务逻辑用OO语言,大家各司其职,各自发挥自己的长处。
------解决方案--------------------
近十年的开发,先顶一下

分层是为了什么,肯定不是为了把事情搞复杂,而是为了让复杂系统更清晰,存储过程擅长做的,就让存储过程做。你说的很对,完全封杀存储过程和完全依靠存储过程实现业务逻辑都是不对的,掌握好程度和粒度。

我的一些经验:

1、在不同项目间容易复用的东西,用OO实现,比如权限、工作流、通用的一些功能
2、非常个性化的复杂的业务逻辑,用存储过程实现,调试和将来的修改都容易
3、会经常变化的业务逻辑,写存储过程
4、批量数据处理的功能,写存储过程
5、存储过程千万不能太复杂,注释做的再好,换个人读起来很痛苦,实在太复杂的就分解,也就是做好粒度的控制
6、严格控制存储过程和触发器的数量,太多了就是灾难
------解决方案--------------------
引用:
3、在现实的开发过程中,要开发者掌握各种多层体系架构中的技术(例如ORM,各种设计模式等)是需要付出许多学习成本的,构建一个结构复杂的面向对象系统往往会导致开发失败,项目夭折。而使用存储过程编写的系统则相对要简单得多,并且能够胜任大部分信息系统的开发工作。项目中的程序员大多水平参差不齐,越短的学习周期意味着越高的项目开发成功概率。敏捷开发的思想在于快速构建系统原型,使用存储过程进行二层结构开发能够很好地与敏捷开发方法相契合。


其实一个公司要按照实际可能去评估人员的水平。如果只是认为越是低级就“越高的项目开发成功概率”,这就好象是越是穷就越不敢花钱,最后把自己禁锢死了。可能开公司没有这么明显,而是慢慢地把一个公司的项目都“搞一个死一个”,因为公司技术组织者总是生怕有点对人员素质要求高一些的产品啊。

文章评论

程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
一个程序员的时间管理
一个程序员的时间管理
10个调试和排错的小建议
10个调试和排错的小建议
 程序员的样子
程序员的样子
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
如何成为一名黑客
如何成为一名黑客
程序员的鄙视链
程序员的鄙视链
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
编程语言是女人
编程语言是女人
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
老程序员的下场
老程序员的下场
程序员和编码员之间的区别
程序员和编码员之间的区别
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
旅行,写作,编程
旅行,写作,编程
漫画:程序员的工作
漫画:程序员的工作
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员应该关注的一些事儿
程序员应该关注的一些事儿
我是如何打败拖延症的
我是如何打败拖延症的
程序员必看的十大电影
程序员必看的十大电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
中美印日四国程序员比较
中美印日四国程序员比较
程序员都该阅读的书
程序员都该阅读的书
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
我的丈夫是个程序员
我的丈夫是个程序员
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
代码女神横空出世
代码女神横空出世
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有