楼主: newkid

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

[复制链接]
招聘 : Java研发
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-17 18:02:022011新春纪念徽章
日期:2011-02-18 11:43:36
51#
发表于 2011-2-16 17:24 | 只看该作者
原帖由 newkid 于 2011-2-12 10:44 发表

那你终究得用SQL是不是?你本来调用一次,现在要跑好几次SQL才能完成一个事务,不单不能减负,反而是增加了数据库的负担。如果有例子请举一个。


从这个方面,我觉得非常有道理

使用道具 举报

回复
论坛徽章:
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
52#
 楼主| 发表于 2011-2-16 23:56 | 只看该作者
原帖由 dayspring_chen 于 2011-2-16 10:06 发表
-----------------------------------------------------------------------------
你相当于做了一个报表工具,这里使用动态SQL是不可避免的。
至于这个业务规则引擎,现在做到哪一步了?你不妨拿些简化的例子出来讨论一下。必须承认做这类东西对一个爱动脑筋的程序员是很有诱惑力的,但是结局一般都不乐观:
1. 随着需求的深入,抽离的业务逻辑越来越灵活,到最后你相当于发明了一种语言,这种语言世界上只有几个人能懂。配置元数据比写程序还复杂,比程序还更看不懂。
2. 一不小心没配置好,这个规则引擎就会产生怪异的行为。
3. 配置的组合是无限的,但是你只能对其中的某些做测试,其他的只好听天由命。
4. 引擎部分的代码极其抽象,作者要能知道它会生成什么代码,那些生成的代码又是如何运作的。到最后只有作者本人能够维护这个引擎,其他人不敢动。
5. 有很多临时产生的需求,来不及修改殷勤,就采用元数据+客户化代码的方法。到最后, 客户化代码越来越多,因为大家发现这是解决问题的最佳方法!
-----------------------------------------------------------------------------------
嗯,newkid说的很对,这是开发这类基于元数据变成必须控制的地方,即规则的复杂程度及处理规则引擎的复杂程度。
不要忘记我也是一个玩了oracle十几年的人了。从95年开始玩起的。
1.最早做的是一个接口程序
  就是约定传输的业务表单格式串,依据规则进行解析,分解成主从的结构的insert语句,支持字段级、记录级、表单级规则校验,支持主键自动生成。最早做的是插入操作,后来扩展到更新和删除的业务支持。
  这个项目的场景上有一个核心系统支持数据采集,但后来需要支持多种外部方式的数据插入(网上申报、ocr之类的)。当时设计的元数据结构还是覆盖全面的,基本上交易系统的规则都能够覆盖到。维护的话也还好,对SQL、PL/SQL熟悉的人培训个一周就可以维护了。
  当时还是oracle7,动态sql用dbms_sql搞定,状态信息用raise_application_error传递,呵呵。
2.后来做了一个基于j2ee的三层架构的通用查询
  做过通用查询的都知道,这玩意可很难。最典型的问题是:因为需要处理一个条件需关联一个表,因为关联这个表必须用外连接;主关联从表导致主表的记录数被成倍放大(最糟的是笛卡尔集),汇总统计的主表数据出错;条件数过多的时候拼接的sql已经无法理解,条件和条件间互相影响(机构、时间?),结果和结果间互相影响,条件和结果间互相影响;条件集和结果列无非同一数据集时很难处理等。
  这个我确实等于自己创造了一套理论,将这些都解决了。而且还实现了:业务复合时间支持(如支持年、半年、季度、月份的复合处理),条件集的SQL优化(包括条件位置的多点替换),结果集通过外连接支持样式套表打开。
  最大的查询包括4000多的条件和结果组合,都工作和管理的很好。我已经可以放心让手下人进行维护。也曾和oracle的技术人员进行交流,他们对这种处理也很认可,只是感叹这个唯一的不足是只支持oracle。
3.后来做了一个基于j2ee的三层架构的通用报表
  报表显示等是基于润乾的。在润乾之外包装了一层管理层,将报表分为按版本(有效起始终止日期的)划分的子报表,每个子报表有自己的时间、机构等级、前后台、生表前条件校验、生表后特殊处理、报表确认审核、报表回退、报表模板设置。后台调度生表使用的是job,表结果存储最初使用的是clob的xml,后来一时糊涂改成了nest table,最近在考虑要不要改成json。
  总体上这个东西做的还可以,满足客户要求和扩展性都还好,汇总表、表间取数、平衡审核、转换总局之类的都是用存储过程实现维护在代码表中,无论开发效率还是运行运行效率都很高。
4.那个业务规则引擎是我再总结当前交易系统弊端加上对以前用存储过程开发进行反思后考虑的。
  首先有以前做通用接口的经验,有些思路可以借鉴。而且现在技术手段比以前丰富多了。
  当然需要处理以前没有的一些东西,例如webservice、restful等。碰到困难是一定的,但工具就是在应用中磨出来的。至于抽象的粒度及设置的复杂性、覆盖广泛性,必须是设计的人去权衡利弊,进行取舍的。
  当前系统主要苦于:开发人员大部分是java背景的,结果是后台数据结构一团糟,新来业务需求,项目经理往往是新建一套表,导致后台数据不优化,数据利用时必须再另写转换规则进行加工;
  企业级系统的特点是表单多,表单规则复杂,表单随着客户的业务要求,在极短的开发时间内完成修改,且变化的表单前后业务还有很多制约要求。(呵呵,有点像缓慢变化维,可以叫缓慢变化表单)
  开发人员耗费了很大精神在中间层上,用javabean模拟表进行业务逻辑操作。结果是中间的业务逻辑越写越复杂,前台UI客户不友好,后台数据结构BI开发不友好。感觉项目的开发工作没有用在合适的地方。
  至于那个引擎,打算今年开始动手实践,先找个适中的项目做实验。至于你提到的那些副作用,当然很感谢提醒,我也会尽力避免。在功能、灵活性、可维护性间取得平衡。绝不会一意孤行,自取灭亡的。
  做元数据设计,1000个架构师可能有1000种设计法,戏法人人会变,各有巧妙不同的。


原来是前辈,肃然起敬!你说的这些东西我多少都玩过一点,现在我已经返璞归真,对“通用”的东西都存有戒心。现在动态查询我还经常做,其他的最多采用代码生成器的思路,需要什么就做什么,不指望搞出什么引擎。祝愿你成功!如果有实例请到这里分享。
关于通用查询,有几点可以讨论:
因为需要处理一个条件需关联一个表....
可能好几个条件合起来关联一个表,重复关联必须去除。
因为关联这个表必须用外连接.....
如果条件在被连接的表上,绝对不用外连接。外连接用于从其他表取输出列,比如要把ID转换成名称。
主关联从表导致主表的记录数被成倍放大....
连接键一定要用从表主键就不会发生。

使用道具 举报

回复
论坛徽章:
26
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282012新春纪念徽章
日期:2012-01-04 11:49:542013年新春福章
日期:2013-02-25 14:51:24夏利
日期:2013-08-13 23:25:29优秀写手
日期:2013-12-18 09:29:092014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11蓝色妖姬
日期:2015-03-19 09:37:00ITPUB年度最佳技术原创精华奖
日期:2015-03-19 09:43:24
53#
发表于 2011-2-17 16:12 | 只看该作者
动态查询,最关键的是要绑定变量;这个好多开发人员会忽略或者不知道;

使用道具 举报

回复
论坛徽章:
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
54#
 楼主| 发表于 2011-2-17 23:21 | 只看该作者
原帖由 qingyun 于 2011-2-17 16:12 发表
动态查询,最关键的是要绑定变量;这个好多开发人员会忽略或者不知道;


确实,如果绑定变量个数不定,就更需要技巧。
PLSQL的绑定变量是自动的,不用绑定变量的问题,只有在动态SQL会碰到。
如果用其他开发语言,相当于所有SQL都是动态的,有的开发人员因为“懒”,或者不懂,就会直接拼入常量。
这就带出另一个问题:SQL注入攻击。
改用存储过程,收回所有表的读写权限,只留下调用存储过程的接口,就会大大改善这个安全问题。即使你注入了SQL也没有用,因为所有表都不可访问!

使用道具 举报

回复
论坛徽章:
4
ITPUB9周年纪念徽章
日期:2010-10-08 09:32:26数据库板块每日发贴之星
日期:2011-02-27 01:01:02SQL大赛参与纪念
日期:2011-04-13 12:08:17ITPUB社区OCM联盟徽章
日期:2013-12-25 09:21:56
55#
发表于 2011-3-6 21:16 | 只看该作者
若不能做到楼上说的方式,也可以用视图代替表。对权限进行控制。

使用道具 举报

回复
论坛徽章:
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
56#
 楼主| 发表于 2011-3-7 01:37 | 只看该作者
原帖由 duqiangatom 于 2011-3-6 21:16 发表
若不能做到楼上说的方式,也可以用视图代替表。对权限进行控制。

这也能一定程度改善,总之就是要尽量回收对表的操作权限。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
57#
发表于 2011-3-7 10:45 | 只看该作者
能解决实际问题就是王道(在有限的资源条件下),最终还是要让产品稳定高效运行,至于什么方式,我觉得各有各的风格

就好比,你主张用葵花宝典,我主张用九阴真经,都很猛,但是根据具体情况来用列

PS:如果产品没有很好的黏性,无法带来更多的价值,无法变现,用的再好的技术都是浮云

如果大家真的讨论深入,就用实际的案例或你经历过的项目来讨论各自的观点,这样更好点,否则你说有理,我说有理

其实都没实际事实论证来的有效

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:34ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32
58#
发表于 2011-3-7 11:54 | 只看该作者
原帖由 fan0124 于 2011-3-7 10:45 发表
能解决实际问题就是王道(在有限的资源条件下),最终还是要让产品稳定高效运行,至于什么方式,我觉得各有各的风格

就好比,你主张用葵花宝典,我主张用九阴真经,都很猛,但是根据具体情况来用列

PS:如果产品没有很好的黏性,无法带来更多的价值,无法变现,用的再好的技术都是浮云

如果大家真的讨论深入,就用实际的案例或你经历过的项目来讨论各自的观点,这样更好点,否则你说有理,我说有理

其实都没实际事实论证来的有效

在网上谈谈技术细节问题,或在心得上谈点个人看法,一起交流成长
大张旗鼓讨论案例项目不太实际吧,还要分出谁有理没理?

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2006-05-12 15:15:27数据库板块每日发贴之星
日期:2006-05-19 01:01:35ITPUB元老
日期:2006-05-19 08:58:40操作系统板块每日发贴之星
日期:2006-06-05 01:01:57会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412014系统架构师大会纪念章
日期:2014-08-28 15:15:37技术图书徽章
日期:2014-09-09 11:11:10
59#
发表于 2011-3-7 12:17 | 只看该作者
原帖由 eof007 于 2011-3-7 11:54 发表

在网上谈谈技术细节问题,或在心得上谈点个人看法,一起交流成长
大张旗鼓讨论案例项目不太实际吧,还要分出谁有理没理?

不是这么说吧。很多时候理论仅仅是理论,大家都有了一定基础之后,其实更需要的是针对各种具体案例的经验。

比如本贴提到的存储过程的运用,不同情况下有完全不同的策略。像我现在接触的一个DW系统,就是ETL工具和存储过程混用。为什么会这样,自然存在种种原因。

使用道具 举报

回复
论坛徽章:
11
2010新春纪念徽章
日期:2010-03-01 11:19:072014年新春福章
日期:2014-02-18 16:42:02优秀写手
日期:2014-02-09 06:00:122011新春纪念徽章
日期:2011-02-18 11:43:34数据库板块每日发贴之星
日期:2010-12-22 01:01:01数据库板块每日发贴之星
日期:2010-11-26 01:01:012010广州亚运会纪念徽章:拳击
日期:2010-11-22 15:26:49ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51数据库板块每日发贴之星
日期:2010-07-10 01:01:04数据库板块每日发贴之星
日期:2010-07-07 01:01:01
60#
发表于 2011-3-7 12:45 | 只看该作者
如果没有实际经历过的场景和产品项目经验做支撑,纯理论上的探讨我觉得就是浪费时间

你选择用还是不用是为了一个目的:解决实际问题——什么实际问题(拜托,当然是你在实际工作中遇到的或正在遇到的技术难点,或者架构问题这

样的)——最终给你的项目和产品带来价值——你的技术产生了价值——有更好的薪酬奖励,有成就感,有大家的认可感,个人的实际积累

就这么简单

使用道具 举报

回复

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

本版积分规则 发表回复

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