当前位置: 首页 > article >正文

关于复杂业务逻辑使用SQL还是java代码实现的思考

文章目录

  • 业务场景
  • 开发效率方面
  • 架构升级方面
  • 可维护性方面
  • 业务逻辑复杂度方面
  • 资源开销方面
  • 如何选择
  • 总结


先说结论:建议复杂业务逻辑使用java代码实现或者两者结合使用,将两者的优势结合起来。以下为本人的相关依据:

业务场景

现在有一个复杂业务逻辑需求。此时有两种实现方法:

  1. 写一条复杂SQL,相关业务逻辑写在SQL中(重SQL)
  2. 写多条简单的SQL,在service层进行调用处理。(重Java)

接下来通过各个方面来分析一下两种方式的优缺点。

开发效率方面

开发效率方面,使用SQL实现的方式明显比java实现要快很多。

  • 使用SQL写复杂业务,写完后在数据库中运行一下,结果正确的话就可以直接使用了。
  • 而使用java实现则需要先去多个dao层拿基础数据,如何还需要在service层进行处理等一系列操作。

架构升级方面

  • 使用SQL实现复杂的逻辑,当需要优化查询时间时先使用索引和各种优化策略,但是如果此时还是查询太慢,就需要加cpu,加内存,换SSD等等。
    如果此时表中数据量过大还需要水平分表时,而业务逻辑跟数据库的数据是强耦合的,这时候就只能通过java重新业务逻辑,实现分表了。
  • 而如果使用java实现,如果遇到数据库瓶颈,则可以使用缓存、分库分表等方法,应用层基本不用改,在DAO层进行路由。

可维护性方面

  • 复杂的SQL虽然可以实现业务逻辑,但是它难以维护和调试。当复杂的SQL慢慢变成成百上千行时,导致代码变得难以理解和修改。如果此时需要添加新的逻辑或修改原来的逻辑,那对开发人员来说将是一场噩梦。复杂SQL换个人来很难理解其意图,这涉及到项目的数据模型+业务逻辑,对这两者都要了解才能真正理解表关联之后的数据结构。
  • 相比之下,使用Java实现业务逻辑可以更好地分离业务逻辑和数据访问逻辑,使代码更加清晰、易于维护和调试。此外,使用java编写业务逻辑还可以利用java的面向对象编程特性,使代码更加可扩展和可重用。

业务逻辑复杂度方面

  • SQL:如果业务逻辑主要涉及数据检索、排序、分组等操作,使用 SQL 通常更加简洁明了。
  • Java:如果业务逻辑涉及复杂的条件判断、循环、外部服务调用等,使用 Java 则更合适。

资源开销方面

  • 复杂查询将逻辑写在一个SQL中,在数据库中只查询一次,网络IO开销较少,这点是优点。但复杂SQL随着时间推移,将会越来越复杂,如果计算量大,则会极度耗费数据库服务器资源,而且不易优化,如果存在分表分库的需求,或者服务拆分,复杂sql就是拦路虎。
  • 使用java代码实现会将逻辑拆分成多条简单sql,会产生更多次IO操作,这点上会存在更多耗时操作。所以循环查询这个是不推荐的,但可以通过分页等来一次查询多条记录,但这种service层就更复杂,好处是容易做到水平扩展,应用服务器做集群远比数据库更简单轻松。

如何选择

  • 如果是在业务初期,并且需要快速开发上线,那么使用重 SQL 模式也是可以理解的,但是还是要抽时间重构成 Java 模式。
  • 如果项目已经开发成熟了,那么旧的重 SQL 逻辑可以暂时不动,新的逻辑都基于 Java 模式开发,先保证慢 SQL 不增加,旧的 SQL 稳定运行,毕竟业务稳定是第一要素。
  • 如果本身就是多服务架构,还是用简单sql更好。如果是单体架构,复杂sql和简单sql组合都无所谓,但简单sql的组合代码更容易复用,也更能充分利用代码生成工具来生成增删改查代码。

总结

  • 开发多年以来,发现系统的瓶颈基本都在数据库,复杂sql就是其根源,难优化、难拆分、业务逻辑分散到sql中、不容易利用IDE等工具定位问题。
  • 因此不建议直接在sql里包含过多逻辑,数据库层就做增删改查,能单表操作就单表操作,会省去很多时间如sql优化、由于复杂sql导致的bug等。建议将复杂业务逻辑使用java代码实现或者两者结合使用,将两者的优势结合起来

参考文章:慢SQL,压垮团队的最后一根稻草


http://www.kler.cn/a/282043.html

相关文章:

  • 近几年新笔记本重装系统方法及一些注意事项
  • 三维测量与建模笔记 - 点特征提取 - 4.3 Harris特征点
  • uniapp 微信小程序地图标记点、聚合点/根据缩放重合点,根据缩放登记显示气泡marik标点
  • 数据科学与SQL:如何计算排列熵?| 基于SQL实现
  • 使用Python和BeautifulSoup进行网页抓取:通过Python编程语言,结合BeautifulSoup库,可以轻松地从网站上抓取所需的信息。
  • Infisical开源密钥管理平台实战指南
  • Golang安装与环境配置
  • 严重腰椎滑脱、无法走路,江山邦尔骨科医院机器人辅助手术为患者完美复位
  • XML 数据格式介绍及其应用
  • 1.5.1、输入输出技术
  • 【编程知识】c++中的结构体和JavaScript中的对象有啥异同
  • 树上dp+分组背包类问题
  • SpringIoc体系结构设计
  • 算法的学习笔记—连续子数组的最大和
  • 【hot100篇-python刷题记录】【杨辉三角】
  • 【Linux】进程概念
  • Andon安灯系统在汽车零部件工厂起到什么作用?
  • 小程序常用界面交互api
  • 双向链表的复杂操作、内核链表、栈
  • 操作系统:哪些函数属于系统调用?
  • Java新版主要特性|2024年最后一个版本即将到来
  • 网络编程Day9_IO多路复用 20240821
  • ThingsKit物联网平台与AIoTedge边缘计算平台的融合创新
  • ESXi服务器无法安装Windows11:“不符合此版本的Windows所需最低系统要求“
  • Python相关系数导图
  • 驱动开发系列12 - Linux Graphics 图形驱动概述(一)