一个程序员的重启

本文探讨了在后端代码和SQL中处理业务的抉择,主要考虑可移植性、可扩展性和性能优化三个方面。作者指出,复杂的SQL在需求变更时会导致维护困难,而后台服务扩展性更强,但数据库在性能优化上有优势。建议根据具体项目情况决定业务处理位置,通常将主要逻辑放在后端,简单操作交给SQL。
摘要由CSDN通过智能技术生成

<<重启4>>

学习分享-要在哪里处理业务

后端代码处理业务和sql处理业务的抉择
-引言

博主最近已经实习差不多两周了,最近也一直在写sql脚本,以前,我在写项目的时候,也没有留意当时写的时候,什么时候要在后端代码处理业务还是sql处理业务。其实,这种情况,网上已经有很多人都有进行过讨论和辩证,博主就简单的总结一下,本人的观点和网上其他人的观点。

-正言

首先,要选择哪里处理业务,就要考虑到这样会影响到哪个方面。
我的总结是三大点:

  1. 可移植性
  2. 可扩展性
  3. 性能优化

第一点:

网上坚持在后端代码处理业务的观点的理由之一——移植性,是数据库好移值植,?还是微服务服务好移植?这个大家dddd,移植性差,也会带来一系列连锁反应,例如时间消耗过长,成本剧增。同时,还有一点就是你要开发的程序是面向甲方还是客户,一旦你面向甲方,你还在sql语句中写大量复杂的sql语句,那就惨了,因为甲方会不断适应客户的需要去修改他的需求,一旦你是复杂的sql的代码

<select id="XXXX" resultType="java.util.HashMap">
    select
    distinct a.user_id as userId,a.user_name as userName,a.mobile as mobile,
    a.position as position,a.create_time as createTime,
    a.avatar as avatar,a.enable as enable,a.status as status ,
    a.qr_code as qrCode,a.roleid as roleid,a.job_no as jobNo
    from wx_cp_user a
    inner join wx_cp_user_group_rel t1 on t1.user_id=a.user_id and t1.corp_id=#{pm.corpId,jdbcType=VARCHAR}
    inner join wx_cp_user_group t2 on t2.dep_id=t1.group_id and t2.corp_id=#{pm.corpId,jdbcType=VARCHAR}
    where
    a.is_delete!=1
    and a.corp_id=#{pm.corpId,jdbcType=VARCHAR}
    <if test="pm.ps != null">
        <if test="pm.ps.mobile != null and pm.ps.mobile !=''">
            and instr(a.mobile,#{pm.ps.mobile})>0
        </if>
        <if test="pm.ps.userId != null and pm.ps.userId !=''">
            and instr(a.user_id,#{pm.ps.userId})>0
        </if>
        <if test="pm.ps.userName != null and pm.ps.userName !=''">
            <if test="pm.ps.isOrQry != null">
                and (instr(a.user_name,#{pm.ps.userName})>0 or instr(a.mobile,#{pm.ps.userName})>0)
            </if>
            <if test="pm.ps.isOrQry == null">
                and instr(a.user_name,#{pm.ps.userName})>0
            </if>
        </if>
        <if test="pm.ps.enable !=null">
            and a.enable = #{pm.ps.enable}
        </if>

        <if test="pm.ps.tabId!=null ">
            and not EXISTS(
            select r.user_id from wx_cp_user_tab_rel r
            where r.status!='2'
            and r.tab_id=#{pm.ps.tabId,jdbcType=NUMERIC}
            and r.corp_id=#{pm.corpId,jdbcType=VARCHAR}
            and a.user_id=r.user_id
            )
        </if>

        <if test="pm.tabIds != null">
            AND a.user_id IN (
            SELECT DISTINCT m.user_id
            FROM wx_cp_user_tab_rel m
            WHERE m.tab_id IN (
            SELECT n.sub_tab_id
            FROM wx_cp_manage_tab n
            WHERE n.tab_id IN
            <foreach close=")" collection="pm.tabIds" item="listItem" open="(" separator=",">
                #{listItem}
            </foreach>
            AND n.corp_id = #{pm.corpId,jdbcType=VARCHAR}
            )
            AND m.corp_id = #{pm.corpId,jdbcType=VARCHAR}
            )
        </if>

        <if test="pm.ps.searchTabId!=null ">
            and EXISTS(
            select r.user_id from wx_cp_user_tab_rel r
            where r.status!='2'
            and r.tab_id=#{pm.ps.searchTabId,jdbcType=NUMERIC}
            and r.corp_id=#{pm.corpId,jdbcType=VARCHAR}
            and a.user_id=r.user_id
            )
        </if>
        <if test="pm.ps.tabBelongDeptId != null and pm.ps.tabBelongDeptId != 0">
            and (instr(t2.dep_tree,#{pm.tabBelongDepTreeChildren,jdbcType=VARCHAR})>0 or t2.dep_tree=#{pm.tabBelongDepTree,jdbcType=VARCHAR} )
        </if>
    </if>
    <if test="pm.depTree!=null and pm.depTree !='' ">
        and (instr(t2.dep_tree,#{pm.depTreeChild,jdbcType=VARCHAR})>0 or t2.dep_tree=#{pm.depTree,jdbcType=VARCHAR}
        )
    </if>
</select>

甲方修改了他的需求,你每次调整sql语句需要花费大量的时间,而且是频繁地去修改。出错的概率和修改的时间成本都很高。

第二点:

从理论上来说,后台服务的扩展比数据库扩展容易,而且能无限水平扩展。同时,因为使用sql解决业务代码 ,导致数据库压力暴增,随时就可能崩溃,这时候就不得不进行数据库扩展,但是(水平切割和垂直切割)不可能无限扩展把,占用和耗费的资源是非常非常昂贵的,而且管理起来也非常费劲,而且还需要定义分割规则,如果只是垂直分割还好说 如果是水平分割那就麻烦咯。然后分表分库带来的是dao层逻辑基本都要全部重写,GG!

第三点

如果这个交到哪里去处理的问题交给数据库系统专家去回答,那么十有八九就是写在SQL上,由于不考虑其他因素,那么他的最大优势就是性能尽在掌中,集群,共享存储,表分区,索引,in memory table, 安全,成熟又稳定!同时,后台程序太自由,标准不统一,维护起来难。但这仅仅从一个数据库专家的角度来考虑,一个成熟又庞大的项目要考虑的方面还有很多。

个人总结

其实,在哪里处理业务,这要在具体项目,具体场景,具体行为才能够判断的出来。不过,绝大多数成熟的项目,会把大部分的业务逻辑放在后端代码上,同时,也在sql上兼顾一些简单的业务需求,比如SQL的强项(聚合函数 , 分组, 多表查询, 排序)这可以交给数据库处理。在项目初期,写的SQL要尽量让人一眼能大概知道什么意思,这样到后面需求逐渐明确后能够再慢慢改正,对同事,后来者,你都好。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值