首页 > 数据库 >后端代码处理业务和sql处理业务的抉择

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

时间:2024-12-19 15:42:28浏览次数:8  
标签:fr java 处理 数据库 单数 业务 sql 签约

转载:https://blog.csdn.net/weixin_45203607/article/details/120252073

语言不限(java c# go …)

数据库(关系型数据库)不限(mysql PostgreSQL mongodb oracle…)

下面我就以java 和mysql来讲解 使用sql语句处理业务代码 和使用java处理业务的区别 (其他语言和数据库都一样)

在互联网公司开发,看到了最大的不同就是后台代码算法比较多,模块服务化,很多逻辑都写在了后台代码中,比如各种计算甚至连诸如分组排序这种SQL最擅长的功能。

到底逻辑是应该写在后台程序中还是SQL中?这个话题其实没少讨论过

查询效率

使用sql处理业务数据,的确,速度会比使用java处理要快些.但是这只是相对的,

因为很多公司一个项目就一个数据库 不要抬杠(dev uat prod) 只能算是一个,那么你将所有业务逻辑代码都使用sql解决了.

会造成数据库压力超级大,随着用户不断的增加,就会造成提前分库分表,导致开销暴增,

如果很多个请求同时发起,然后数据库只能一条一条的处理,导致反应速度慢,如果再狠点,那就数据库崩掉了。

如果使用java来处理业务逻辑利用微服务的特点进行负载均衡那么就能将压力减少到最低

修改需求

如果业务代码基本都使用sql解决了那么就会造成sql语句少则,几十行多则上百上千行,如果是面向甲方开发的公司那么就完蛋了.

因为面向甲方开发的公司,一般需求更换特别频繁,这样就导致sql语句特别难以维护.

来看看下面的sql先别管规不规范,你第一眼看去是不是有点头疼.

SELECT tb.*,( tb.`自由行签约单数` + tb.`跟团签约单数` + tb.`签证签约单数` ) 总签约数 
FROM
	(
	SELECT
		d.counselor_id,
		d.user_name,
		IFNULL( a.自由行签约单数, 0 )自由行签约单数,
		IFNULL( a.自由行成单金额, 0 )自由行成单金额,
		IFNULL( b.跟团签约单数, 0 )跟团签约单数,
		IFNULL( b.跟团成单金额, 0 )跟团成单金额,
		IFNULL( c.签证签约单数, 0 )签证签约单数,
		IFNULL( e.自由行出行单数, 0 )自由行出行单数,
		IFNULL( f.跟团出行单数, 0 )跟团出行单数 
	FROM
		( SELECT DISTINCT cl.counselor_id, us.user_name FROM sys_client cl LEFT JOIN sys_user us ON cl.counselor_id = us.user_id ) d
		LEFT JOIN (
		SELECT
			fr.counselor_id,
			count( fr.free_id ) 自由行签约单数,
			sum( fr.deal_price )自由行成单金额 
		FROM
			sys_free_inquiry fr 
		WHERE
			fr.success_time >= '2019-07-01' 
			AND fr.success_time <= '2019-07-31' 
		GROUP BY
			fr.counselor_id 
		) a ON d.counselor_id = a.counselor_id
		LEFT JOIN (
		SELECT
			fr.counselor_id,
			count( fr.inquiry_id ) 跟团签约单数,
			sum( fr.deal_price )跟团成单金额 
		FROM
			sys_team_inquiry fr 
		WHERE
			fr.success_time >= '2019-07-01' 
			AND fr.success_time <= '2019-07-31' 
		GROUP BY
			fr.counselor_id 
		) b ON d.counselor_id = b.counselor_id
		LEFT JOIN (
		SELECT
			fr.counselor_id,
			count( fr.visa_id ) 签证签约单数 
		FROM
			sys_visa fr 
		WHERE
			fr.success_time >= '2019-07-01' 
			AND fr.success_time <= '2019-07-31' 
		GROUP BY
			fr.counselor_id 
		) c ON d.counselor_id = c.counselor_id
		LEFT JOIN (
		SELECT
			fr.counselor_id,
			count( fr.free_id ) 自由行出行单数 
		FROM
			sys_free_inquiry fr 
		WHERE
			fr.start_date >= '2019-07-01' 
			AND fr.start_date <= '2019-07-31' 
		GROUP BY
			fr.counselor_id 
		) e ON d.counselor_id = e.counselor_id
		LEFT JOIN (
		SELECT
			fr.counselor_id,
			count( fr.inquiry_id ) 跟团出行单数 
		FROM
			sys_team_inquiry fr
			LEFT JOIN sys_team tm ON fr.team_number = tm.team_number 
		WHERE
			tm.start_date >= '2019-07-01' 
			AND tm.start_date <= '2019-07-31' 
		GROUP BY
			fr.counselor_id 
		) f ON d.counselor_id = f.counselor_id 
	ORDER BY
	d.counselor_id 
	) tb

这个只是我见到的比较简单的了而且,还没有加一些偏僻的函数以及CASE

如果甲方让你修改需求的话你会怎么改???, 是不是有种无从下手的感觉,

还有一些sql语句很长的,都应用在很多接口中(也就是统称,一条sql语句解决所有业务 -sql最高境界)

如果你改了长sql某一个地方就可能导致整个系统完蛋,或者其他某个接口查询不到想要的结果…

扩展性

因为使用sql解决业务代码 ,导致数据库压力暴增,随时就可能崩溃,这时候就不得不进行数据库扩展

但是(水平切割和垂直切割)不可能无限扩展把,占用和耗费的资源是非常非常昂贵的,而且管理起来也非常费劲,而且还需要定义分割规则

如果只是垂直分割还好说 如果是水平分割…呵呵明白的都懂.

最重要的是后端的全部dao层逻辑基本都要重写, 后面就不用多说了都是泪…没有几个月呵呵,就算改好了,后期测试也是需要很久的,

如果是非常老的项目…

移值性

是数据库好移值 , 还是微服务服务好移值,都懂

以上问题的解决办法

在项目初期定义一套规范.要求开发人员不能在数据库中处理特别复杂的逻辑,

聚合函数 , 分组, 多表查询, 排序 除外,因为这些是数据库的强项,使用java处理就太费劲了 尽量少使用case IF … 能使用java解决的尽量在业务层解决

sql语句不要写的太复杂,必须能一眼能看出来是干了啥,而不是凑了半天,都不知道是干的是啥东西,

这个没有一定的标准,因为业务的原因,需要现场设计,哪些数据需要在数据库处理,哪些数据是在java业务层处理,

最后上传代码前一定要严格把关,坚持一段时间后项目的这个模式就稳定了,你好我好大家都好…

标签:fr,java,处理,数据库,单数,业务,sql,签约
From: https://www.cnblogs.com/java-six/p/18617375

相关文章

  • 【2024-2017】Adobe图像处理软件 Photoshop(常简称为PS)下载安装
    AdobePhotoshop软件简介AdobePhotoshop(常简称为PS)是由Adobe公司开发的一款图像处理软件。自1988年首次发布以来,Photoshop以其强大的图像编辑功能和用户友好的界面而受到全球设计师、摄影师以及艺术家的喜爱。它广泛应用于摄影后期处理、数字绘画、图形设计、网页设计以及动......
  • 常见漏洞—SQL注入
    前段时间刷了技能树,趁热打铁,把学到的知识点总结一下1.SQL注入类别1-1.按照有无回显可以把SQL注入分为有回显的SQL注入盲注1-2.按照SQL注入方法可以分为Union注入布尔注入时延注入报错注入1-3.按照注入位置可以分为GET参数注入POST参数注入HTTP请求头注入2.攻击思路寻......
  • MySQL中EXPLAIN的Extra字段值Using index 或 Using index,Using where 或 Using where
    MySQL的架构分成了server层和存储引擎层(storageengine),server层通过调用存储引擎层来返回数据。1.Usingindex表示查询的列被索引覆盖,因而无需回表查询,因而效率更高。2.Usingindex,Usingwhere表示查询的列被索引覆盖,且where筛选条件是索引列前导列的一个范围,或者是索引列的......
  • 业务幂等性技术——3
    4、消息幂等性在系统中当使用消息队列时,无论做哪种技术选型,有很多问题是无论如何也不能忽视的,如:消息必达、消息幂等等。本章节以典型的RabbitMQ为例,讲解如何保证消息幂等的可实施解决方案,其他MQ选型均可参考。4.1消息重试演示消息队列的消息幂等性,主要是由MQ重试机制引......
  • nacos兼容sqlserver数据库
    源码连接:wanqiu/nacos-datasource-support1、最外层pom.xml添加驱动:<dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>12.6.0.jre8</version></dependency>2......
  • C#使用log4net和sqlite数据库记录日志
    1安装包两个包:log4netSystem.Data.SQLite第二个包也可以使用Microsoft.Data.Sqlite,查到的资料显示如果环境使用的是.NETCore或.NET5+,则建议使用Microsoft.Data.Sqlite。但是我并没有测试第二个包,可能使用上有区别。2下载Sqlite如果本地没有sqlite环境的话,需要先下......
  • 大数据 | 数据存储技术与应用深度解析,HDFS/ Kudu/ 云对象存储/ NoSQL数据库,及数据虚拟
    一、大数据存储的基本需求要理解大数据存储技术的发展方向,首先需要明确大数据存储面临的挑战和需求。1.数据规模:高扩展性大数据通常以TB、PB甚至EB为单位进行计算,因此,数据存储系统需要具备高扩展性,能够随着数据量的增长快速增加存储容量。例如,传感器网络、社交媒体、或......
  • Windows Server 2022 集群服务器技术提供了一种可靠的方式来提高业务连续性、增强系统
    WindowsServer2022集群服务器简介什么是WindowsServer2022集群服务器?WindowsServer2022集群服务器是一种由多个物理或虚拟服务器组成的系统,这些服务器通过网络连接形成一个群集(Cluster)。群集中的服务器协同工作,共同提供高可用性、负载均衡、灾难恢复等功能。WindowsS......
  • JavaWeb笔记(项目案例-登录功能、登录校验、异常处理)
    资料登录功能步骤DeptController的请求路径都是/Dept开头的EmpController的请求路径都是/Emp开头的UploadController是用来文件上传的那么LoginController就是用来登录的注意功能走的其实是emp实体类注意mapper接口中的方法名问题,login是登录,是一个业务方法,但是......
  • 实验6 模板类、文件I/O和异常处理
    实验任务4:Vector.hpp源码:1#pragmaonce2#include<iostream>3#include<stdexcept>4usingnamespacestd;56template<typenameT>7classVector{8public:9Vector(intn):size(n)10{11if(n<0)12......