楼主: myth8860

[每周一议]应用是否应该使用大量的数据库特性?

[复制链接]
招聘 : 系统架构师
认证徽章
论坛徽章:
369
秀才
日期:2015-08-10 09:03:20巨蟹座
日期:2015-09-09 14:25:25巨蟹座
日期:2015-09-10 09:03:46秀才
日期:2015-09-11 10:43:06摩羯座
日期:2015-09-20 17:10:27秀才
日期:2015-09-21 09:46:16秀才
日期:2015-09-21 11:16:42秀才
日期:2015-10-08 17:57:58天枰座
日期:2015-10-28 18:28:29秀才
日期:2015-09-06 10:42:32
发表于 2012-1-18 10:55 | 显示全部楼层
单纯db个人认为只是做数据存储和简单检索.

使用道具 举报

回复
认证徽章
论坛徽章:
54
秀才
日期:2017-02-22 15:18:002015年新春福章
日期:2015-03-06 11:57:31懒羊羊
日期:2015-03-04 14:48:16马上有对象
日期:2014-10-24 17:37:552014年世界杯参赛球队: 比利时
日期:2014-08-05 11:35:382014年世界杯参赛球队: 阿根廷
日期:2014-07-15 10:49:33马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11路虎
日期:2014-01-02 12:55:56ITPUB社区12周年站庆徽章
日期:2013-10-08 15:00:34
发表于 2012-1-23 17:22 | 显示全部楼层
"嗯,非常有道理,把业务的东西都搞到数据库里面来实现,维护及其麻烦。"。。有意思
世界上有不同的工具,有不同的道路,实在没法用一种通用或经典的态度去选择一个万能的标准。。。
不同情况,有不同的选择,这个论题太宽广,没法从某个局部去讨论
对于一个商业产品,更多的是一种权衡取舍,不见得每一个取舍都最优、最具经济价值
不是很特别的需求,还没见过一个产品就一概支持所有主流DB,要移植时,必定还是有或多或少的修改
比如说典型的BOM递归查询,若不利用ORACLE、SQL SERVER<2005 and 2008,2000只能SP处理>的特性,非得自个儿在APP or client繁琐实现?
就像SAP一样,人家也是分For ORACLE and for SQL Server版,也并没笼统地标准地for all DB

倾向于充分利用DB特性,而不是为了移植而裹足不奔,即使已有多DB或某天有多DB需求,那么这个DB肯定是既定的三两个,针对实现为上策

标准和通用是一回事儿,现实也是一回事儿。。。没有人按照法律、道德规范去生活吧??

使用道具 举报

回复
论坛徽章:
92
2011新春纪念徽章
日期:2011-01-25 15:42:33咸鸭蛋
日期:2012-03-19 10:46:00版主1段
日期:2012-05-15 15:24:11奥运会纪念徽章:排球
日期:2012-08-29 07:02:50奥运会纪念徽章:跳水
日期:2012-09-26 06:44:27ITPUB 11周年纪念徽章
日期:2012-09-28 17:34:42ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:32奥运会纪念徽章:击剑
日期:2012-10-12 07:20:332013年新春福章
日期:2013-02-25 14:51:242012新春纪念徽章
日期:2012-02-13 15:13:20
发表于 2012-1-24 18:01 | 显示全部楼层
貌似OLTP的web应用,大量使用数据库特性(比方说存储过程)的案例比较少。

使用道具 举报

回复
论坛徽章:
6
ITPUB8周年纪念徽章
日期:2009-09-27 10:21:222010新春纪念徽章
日期:2010-03-01 11:07:242010广州亚运会纪念徽章:橄榄球
日期:2010-11-29 11:24:21ITPUB官方微博粉丝徽章
日期:2011-08-17 10:35:362012新春纪念徽章
日期:2012-01-04 11:50:44马上有车
日期:2014-03-25 09:39:08
发表于 2012-1-28 14:57 | 显示全部楼层
将大量业务逻辑在数据库中实现(App和DB合为一体),好处是:不需要太多考虑系统架构的问题,业务逻辑代码集中易于维护,程序部署简单,对人员要求相对简单;

要想做好可移植性需要在架构上花工夫和人力,架构要是做不好或者设计做不好,后期维护是噩梦,对人员要求相对复杂,各个角色都要求有强人才行,要想做到支持多数据库,要求可能更多(毕竟实际的应用不仅仅是CURD)。

至于性能优化,对于上述两种情况而言所要遵循的原则还是一致的,只是着力的方面可能不同,不过前一种有个缺陷是:由于是App+DB混合,除了挖掘DBMS的性能似乎别无他法,可扩展性不强。

LZ头疼的问题:部委做好的系统由于软件和硬件绑定不太容易往下推,建议可以考虑虚拟化技术(将应用虚拟化到其他远端)。

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
38
2010新春纪念徽章
日期:2010-03-01 11:19:10ITPUB社区OCM联盟徽章
日期:2014-03-19 09:57:09问答徽章
日期:2014-03-17 09:53:582014年新春福章
日期:2014-02-18 16:43:09优秀写手
日期:2013-12-18 09:29:14奔驰
日期:2013-11-29 09:43:42阿斯顿马丁
日期:2013-11-19 10:38:162013年新春福章
日期:2013-02-25 14:51:24奥运会纪念徽章:游泳
日期:2012-09-11 12:38:112012新春纪念徽章
日期:2012-02-13 15:11:52
发表于 2012-1-29 15:26 | 显示全部楼层
虚拟化技术是一个不错的解决方案

使用道具 举报

回复
论坛徽章:
13
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44美羊羊
日期:2015-03-04 14:48:582013年新春福章
日期:2013-04-08 17:42:48ITPUB社区OCM联盟徽章
日期:2013-03-25 14:09:31ITPUB十周年纪念徽章
日期:2011-11-01 16:20:282010广州亚运会纪念徽章:体育舞蹈
日期:2010-11-29 10:30:362010新春纪念徽章
日期:2010-03-01 11:08:29参与WIN7挑战赛纪念
日期:2009-11-06 16:05:25祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2009-02-27 01:01:04
发表于 2012-1-30 11:09 | 显示全部楼层
newkid 发表于 2012-1-16 22:41
LEFT JOIN 和 (+) 的例子能举一个吗?

select Tpa_rnc_sum.first_result,

      Tpa_rnc_sum.ne_id,

      Tpa_rnc_sum.ne_type,

      soa_get_nename(Tpa_rnc_sum.ne_id, Tpa_rnc_sum.ne_type) ne_name,

      round(SFB_DIVFLOAT_1(NVL(Tpa_rnc_sum.RelReqCS_Conv55, 0) +

                           NVL(Tpa_rnc_sum.NbrRABCSRelIuConn_Conv55, 0),

                           NVL(tpa_rnc_sum.SuccEstabCSNoQueuing_Conv55, 0) +

                           NVL(tpa_rnc_sum.SuccEstabCSQueuing_Conv55, 0),

                           0,

                           0) * 100,

            2) VIRCOLUMN_00,

      round(NVL(Tpa_utrancell_sum.CSTraffic_Conv11, 0) +

            NVL(Tpa_utrancell_sum.CSTraffic_Conv22, 0),

            2) VIRCOLUMN_01,

      round(NVL(SFB_DIVFLOAT_1(NVL(tpa_rnc_sum.RelReqPS_Cause, 0) +

                               NVL(tpa_rnc_sum.NbrRABPSRelIuConn_cause, 0),

                               NVL(tpa_rnc_sum.SuccEstabPSNoQueuing, 0) +

                               NVL(tpa_rnc_sum.SuccEstabPSQueuing, 0),

                               0,

                               0) * 100,

                0),

            2) VIRCOLUMN_02,

      round(NVL(tpa_utrancell_sum.PSUlOct, 0) +

            NVL(tpa_utrancell_sum.PSDlOct, 0),

            2) VIRCOLUMN_03,

      round(NVL(SFB_DIVFLOAT_1(tpa_utrancell_sum.TSNbrAssnBRUUL,

                               tpa_utrancell_sum.Bruul * 0.75,

                               0,

                               0) * 100,

                0),

            2) VIRCOLUMN_04,

      round(NVL(SFB_DIVFLOAT_1(tpa_utrancell_sum.TSNbrAssnBRUDL,

                               tpa_utrancell_sum.Brudl * 0.75,

                               0,

                               0) * 100,

                0),

            2) VIRCOLUMN_05,

      round(NVL(SFB_DIVFLOAT_1(NVL(tpa_rnc_sum.SuccEstabCSNoQueuing_Conv55,

                                   0) + NVL(tpa_rnc_sum.SuccEstabCSQueuing_Conv55,

                                            0),

                               tpa_rnc_sum.AttEstabCS_Conv55,

                               0,

                               0),

                0) *

            NVL(SFB_DIVFLOAT_1(NVL(tpa_utrancell_sum.SuccConnEstab_1, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_6, 0),

                               NVL(tpa_utrancell_sum.AttConnEstab_1, 0) +

                               NVL(tpa_utrancell_sum.AttConnEstab_6, 0),

                               0,

                               0),

                0) * 100,

            2) VIRCOLUMN_06,

      round(SFB_DIVFLOAT_1(tpa_rnc_sum.SuccEstabCSNoQueuing_Conv11 +

                           nvl(tpa_rnc_sum.SuccEstabCSQueuing_Conv11, 0) +

                           tpa_rnc_sum.SuccEstabCSNoQueuing_Conv22 +

                           nvl(tpa_rnc_sum.SuccEstabCSQueuing_Conv22, 0),

                           tpa_rnc_sum.AttEstabCS_Conv11 +

                           tpa_rnc_sum.AttEstabCS_Conv22,

                           0,

                           0) * 100,

           2) VIRCOLUMN_07,

      round(NVL(SFB_DIVFLOAT_1(NVL(Tpa_rnc_sum.RelReqCS_Conv11, 0) +

                               NVL(Tpa_rnc_sum.RelReqCS_Conv22, 0) +

                               NVL(Tpa_rnc_sum.NbrRABCSRelIuConn_Conv11, 0) +

                               NVL(Tpa_rnc_sum.NbrRABCSRelIuConn_Conv22, 0),

                               NVL(Tpa_rnc_sum.SuccEstabCSNoQueuing_Conv11,

                                   0) +

                               NVL(Tpa_rnc_sum.SuccEstabCSQueuing_Conv11, 0) +

                               NVL(Tpa_rnc_sum.SuccEstabCSNoQueuing_Conv22,

                                   0) +

                               NVL(Tpa_rnc_sum.SuccEstabCSQueuing_Conv22, 0),

                               0,

                               0) * 100,

                0),

            2) VIRCOLUMN_08,

      round(NVL(SFB_DIVFLOAT_1(NVL(tpa_rnc_sum.SuccEstabPSNoQueuing, 0) +

                               NVL(tpa_rnc_sum.SuccEstabPSQueuing, 0),

                               tpa_rnc_sum.AttEstabPs,

                               0,

                               0) *

                SFB_DIVFLOAT_1(NVL(tpa_utrancell_sum.SuccConnEstab_2, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_7, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_3, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_8, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_4, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_9, 0),

                               NVL(tpa_utrancell_sum.AttConnEstab_2, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_7, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_3, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_8, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_4, 0) +

                               NVL(tpa_utrancell_sum.SuccConnEstab_9, 0),

                                0,

                               0) * 100,

                0),

            2) VIRCOLUMN_09,

      round(sfb_divfloat_1(nvl(tpa_utrancell_ho_sum.AttOutCS, 0) -

                           nvl(tpa_utrancell_ho_sum.FailOutCS, 0),

                           nvl(tpa_utrancell_ho_sum.AttOutCS, 0),

                           0,

                           0) * 100,

            2) VIRCOLUMN_10,

      round(sfb_divfloat_1(tpa_utrancell_ho_sum.AttOutPsUtran -

                           tpa_utrancell_ho_sum.FailOutPsUtran,

                           tpa_utrancell_ho_sum.AttOutPsUtran,

                           0,

                           0) * 100,

            2) VIRCOLUMN_11

  from Tpa_rnc_sum Tpa_rnc_sum

  left join tpa_utrancell_sum tpa_utrancell_sum

    on Tpa_rnc_sum.first_result = tpa_utrancell_sum.first_result

   and Tpa_rnc_sum.ne_id = tpa_utrancell_sum.ne_id

   and Tpa_rnc_sum.ne_type = tpa_utrancell_sum.ne_type

   and Tpa_rnc_sum.sum_level = tpa_utrancell_sum.sum_level

   and Tpa_rnc_sum.sv_cat_id = tpa_utrancell_sum.sv_cat_id

   and Tpa_rnc_sum.sv_id = tpa_utrancell_sum.sv_id

   and Tpa_rnc_sum.busy_type = tpa_utrancell_sum.busy_type

  left join tpa_utrancell_ho_sum tpa_utrancell_ho_sum

    on Tpa_rnc_sum.first_result = tpa_utrancell_ho_sum.first_result

   and Tpa_rnc_sum.ne_id = tpa_utrancell_ho_sum.ne_id

   and Tpa_rnc_sum.ne_type = tpa_utrancell_ho_sum.ne_type

   and Tpa_rnc_sum.sum_level = tpa_utrancell_ho_sum.sum_level

   and Tpa_rnc_sum.sv_cat_id = tpa_utrancell_ho_sum.sv_cat_id

   and Tpa_rnc_sum.sv_id = tpa_utrancell_ho_sum.sv_id

   and Tpa_rnc_sum.busy_type = tpa_utrancell_ho_sum.busy_type

where Tpa_rnc_sum.sum_level = 0

   and Tpa_rnc_sum.ne_type in (9200)

   and Tpa_rnc_sum.sv_cat_id = -1

   and Tpa_rnc_sum.sv_id = -1

   and Tpa_rnc_sum.busy_type = 0

   and Tpa_rnc_sum.first_result =

      (select max(trunc(first_result, 'hh')) - 1

         from Tpa_rnc_sum

        where first_result >= trunc(sysdate, 'hh') - 8

          and first_result <= trunc(sysdate, 'hh'))

这个语句对于 and Tpa_rnc_sum.first_result =

      (select max(trunc(first_result, 'hh')) - 1

         from Tpa_rnc_sum

        where first_result >= trunc(sysdate, 'hh') - 8

          and first_result <= trunc(sysdate, 'hh'))这个限制条件不会根据Tpa_rnc_sum.first_result = tpa_utrancell_sum.first_result这个条件被转移到 tpa_utrancell_sum 表,从而导致 tpa_utrancell_sum出现全表扫描,而是用Oracle的SQL99语法写成(+)形式则没有全表扫描问题。

使用道具 举报

回复
论坛徽章:
57
SQL极客
日期:2013-12-09 14:13:35秀才
日期:2016-01-21 13:42:39秀才
日期:2016-01-13 12:14:26SQL大赛参与纪念
日期:2016-01-13 10:32:19SQL数据库编程大师
日期:2016-01-13 10:30:43秀才
日期:2015-12-14 14:47:54秀才
日期:2015-10-19 15:50:392015年新春福章
日期:2015-03-06 11:58:18懒羊羊
日期:2015-03-04 14:52:11优秀写手
日期:2014-11-08 06:00:14
发表于 2012-2-7 20:20 | 显示全部楼层
应该使用,但是可以考虑同一种功能在不同数据库上用不同的方式实现。

使用道具 举报

回复
论坛徽章:
2
2008新春纪念徽章
日期:2008-02-13 12:43:032013年新春福章
日期:2013-02-25 14:51:24
发表于 2012-2-8 13:23 | 显示全部楼层
本帖最后由 wxz317 于 2012-2-8 13:27 编辑

对于应用开发来说,使用某些数据库的特性可能大大的减少开发成本,比如树型查询、分析函数
但使用了这些特性以后移植到其它数据库的时候就会有很多麻烦,甚至无法进行移植
比如使用了oracle的mvcc,可能就很难将这种应用移植到其它数据库上
但对于数据库厂商来说,很希望应用开发的时候使用数据库的特性,这样该应用基本就绑定到该数据库上了

使用道具 举报

回复
招聘 : 数据库管理员
认证徽章
论坛徽章:
83
IT宝贝
日期:2013-11-15 18:40:242015年新春福章
日期:2015-03-06 11:57:31美羊羊
日期:2015-03-04 14:48:58马上加薪
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11
发表于 2012-2-16 14:27 | 显示全部楼层
感谢大家参与讨论,本次讨论newkid,yanggq,htyro,lucky_sunny,michael1983 获赠徽章及pub币,已经发送,请查收,欢迎更多的朋友继续参与此话题讨论!

使用道具 举报

回复

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

本版积分规则 发表回复

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