楼主: newkid

[精华] re: 关于数据库存储过程的一些讨论

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
 楼主| 发表于 2011-2-12 00:14 | 只看该作者
原帖由 dayspring_chen 于 2011-2-11 09:48 发表
1.把存储过程做成调用接口包。
2.为了更方便不同客户端调用,可以用表函数作为访问方式(以自治事务进行DML,用表函数返回状态信息)
3.存储过程里面用动态sql(execute immediate,dbms_sql),通过访问元数据表读取业务规则,实现访问控制。即业务逻辑并不在存储过程中,而在元数据表中。
4.通过维护元数据表来进行业务扩展、业务调整、业务作废工作。元数据表加上机构级别、业务起始终止时间、自定义限制等,实现生命周期及细粒度控制。
5.在此基础上,将开发团队分为3个组:数据处理组、工具组、业务定制组,以简驭繁,对项目需求进行分解,实现极限编程。
已经在3个以上项目中按此方式实施。如有兴趣请加我msn:dayspring_chen@yahoo.com.cn。


我很不赞同你的一些做法。
2.为了更方便不同客户端调用,可以用表函数作为访问方式(以自治事务进行DML,用表函数返回状态信息)
为什么用表函数就更方便?
你全都是用表函数返回嵌套表,然后用SELECT...FROM TABLE(...)? 这样有什么好处?
如果要返回结果集,可以打开一个REF CURSOR并返回。
自治事务要特别小心。基本上,除了写日志,其他的应用都是错的。你这样做,将不得不把COMMIT放到你的函数里。这是不提倡的,COMMIT最好交给客户端去处理。另外你的函数将很难模块化,因为每个都是不同的事务!比如函数A调用函数B, A和B应该在同一个事务里,你如果在A,B里用了自治事务,全乱套了。
3.存储过程里面用动态sql.....
动态SQL是应该尽力避免的。它的应用范围及其有限,一般是为了组合灵活的查询条件。如果你把事务处理也用动态SQL实现,一定有问题。
动态SQL程序很难读,很难维护,无法在编译的时候发现语法问题;因为多隔了一层,效率也要打个折扣。
你可以把业务逻辑中一些灵活的部分抽出来进行参数化,也就是通过配置的方式来进行控制,但是“执行动作”应该都是静态代码,它只是根据不同的配置走不同的分支。
如果你的需求决定了有很多雷同的代码,那么你可以利用你的元数据来生成静态代码,这样节省了人工,但是最终编译、执行的代码还是静态的。
4.通过维护元数据表来进行....
如果元数据表是我上述提到的配置表,这样的做法是可取的。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
12#
 楼主| 发表于 2011-2-12 00:15 | 只看该作者
本帖的反方不怎么给力啊。淘宝的大师们呢?还没上班?

使用道具 举报

回复
论坛徽章:
38
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:12:09现任管理团队成员
日期:2011-11-07 09:46:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41ITPUB9周年纪念徽章
日期:2010-10-08 09:31:21版主3段
日期:2012-05-15 15:24:112009新春纪念徽章
日期:2009-01-04 14:52:282010新春纪念徽章
日期:2010-03-01 11:06:202009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00
13#
发表于 2011-2-12 02:19 | 只看该作者
原帖由 solomon_007 于 2011-2-11 10:56 发表
TOM 的一本我几年前买的一本书(好象是ORACLE设计优化什么的,具体不记得了)中也提过,开发的原则是:
能一句SQL搞定的就SQL搞定,
SQL搞不定的就PLSQ搞定,
PLSQL搞不定的就 JAVA 外部过程
JAVA 外部过程搞不定的就 C 外部过程
C 外部过程搞不定的就放弃。。。


书名:<Expert Oracle>
原文:
I have a pretty simple mantra when it comes to developing database software:
❑ You should do it in a single SQL statement if at all possible.
❑ If you cannot do it in a single SQL Statement, then do it in PL/SQL.
❑ If you cannot do it in PL/SQL, try a Java Stored Procedure.
❑ If you cannot do it in Java, do it in a C external procedure.
❑ If you cannot do it in a C external routine, you might want to seriously think about why it is
you need to do it...

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
14#
 楼主| 发表于 2011-2-12 02:27 | 只看该作者
原帖由 guostong 于 2011-2-12 02:19 发表


书名:
原文:
I have a pretty simple mantra when it comes to developing database software:
❑ You should do it in a single SQL statement if at all possible.
❑ If you cannot do it in a single SQL Statement, then do it in PL/SQL.
❑ If you cannot do it in PL/SQL, try a Java Stored Procedure.
❑ If you cannot do it in Java, do it in a C external procedure.
❑ If you cannot do it in a C external routine, you might want to seriously think about why it is
you need to do it...


兔兔有阵子把这作为签名。

使用道具 举报

回复
论坛徽章:
38
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:12:09现任管理团队成员
日期:2011-11-07 09:46:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41ITPUB9周年纪念徽章
日期:2010-10-08 09:31:21版主3段
日期:2012-05-15 15:24:112009新春纪念徽章
日期:2009-01-04 14:52:282010新春纪念徽章
日期:2010-03-01 11:06:202009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00
15#
发表于 2011-2-12 02:59 | 只看该作者
原帖由 newkid 于 2011-2-12 02:27 发表


兔兔有阵子把这作为签名。


那会儿我还不知道这是 Tom 说的,可崇拜兔兔了.

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
16#
发表于 2011-2-12 08:52 | 只看该作者
原帖由 guostong 于 2011-2-12 02:19 发表


书名:
原文:
I have a pretty simple mantra when it comes to developing database software:
❑ You should do it in a single SQL statement if at all possible.
❑ If you cannot do it in a single SQL Statement, then do it in PL/SQL.
❑ If you cannot do it in PL/SQL, try a Java Stored Procedure.
❑ If you cannot do it in Java, do it in a C external procedure.
❑ If you cannot do it in a C external routine, you might want to seriously think about why it is
you need to do it...



哈哈,到底是搞技术的,就喜欢刨根究底。。。

楼上的几位都很精力充沛啊,半夜2点还挂在这个上面。。。

使用道具 举报

回复
论坛徽章:
81
青年奥林匹克运动会-马术
日期:2014-09-10 21:37:07奥运会纪念徽章:跳水
日期:2012-09-22 18:27:58奥运会纪念徽章:现代五项
日期:2012-09-07 17:33:44奥运会纪念徽章:铁人三项
日期:2012-06-15 21:27:24版主1段
日期:2012-05-15 15:24:11蜘蛛蛋
日期:2012-05-14 10:50:40灰彻蛋
日期:2012-03-06 19:24:222012新春纪念徽章
日期:2012-02-13 15:12:092012新春纪念徽章
日期:2012-02-13 15:12:09ITPUB 11周年纪念徽章
日期:2012-10-09 18:05:37
17#
发表于 2011-2-12 09:07 | 只看该作者
我也有很多条理由不用存储过程,其中最重要的一条就是:当你的系统非常繁忙,还是建议把数据库用得越简单越好

使用道具 举报

回复
论坛徽章:
28
2010数据库技术大会纪念徽章
日期:2010-05-13 09:34:232012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:252012新春纪念徽章
日期:2012-02-13 15:12:25版主2段
日期:2012-07-05 02:21:032013年新春福章
日期:2013-02-25 14:51:24ITPUB社区12周年站庆徽章
日期:2013-08-12 09:34:36马上有车
日期:2014-02-19 11:55:14
18#
发表于 2011-2-12 09:36 | 只看该作者
newkid的观点和Tom的一致,我觉得面向传统企业的应用和面向互联网的应用是有很多差别的,对传统企业应用比如ERP系统来说,newkid的说法可能是合适的。很多互联网公司只是把数据库作为在硬盘上持久存储数据的一个工具而已,缓存才是他们核心的东西,而大多也没有十分复杂的业务逻辑,即使有复杂的业务逻辑也是通过异步操作等手段处理,这样能更灵活的处理高并发访问的情况,如果业务逻辑都封在数据库里,实际对数据库运行环境的要求是很高的,扩展方面可能也有问题。

使用道具 举报

回复
论坛徽章:
69
生肖徽章2007版:羊
日期:2008-11-14 14:42:19复活蛋
日期:2011-08-06 08:59:05ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20版主4段
日期:2012-05-15 15:24:11
19#
发表于 2011-2-12 09:44 | 只看该作者
我是来学习的

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
20#
发表于 2011-2-12 10:14 | 只看该作者
我也觉得应该用灵活的角度去看待这个问题,我现在用的环境是newkid说的,把很多逻辑都放在包中实现了
但是在数据库本身访问压力大的情况下,再用数据库来实现业务逻辑,就必然会出现瓶颈,以前听taobao的架构师讲过,他们是尽量只把核心数据库当作数据存储来使用,逻辑之类的都放到前端来实现了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表