{eval=Array;=+count(Array);}

问答专栏Q & A COLUMN

是否应该将复杂的逻辑写进sql中?

leviuslevius 回答0 收藏1
收藏问题

7条回答

Juven

Juven

回答于2022-06-28 14:09

软件项目本身会有很多分类。在IT传统项目/内部系统中,往往仍有很多项目采用复杂逻辑写入sql或存储过程的做法。当然并不代表这个做法是最佳的。

还是先抛出结论。

单单从技术角度讲,是绝不应该将复杂逻辑写入sql的。如果题主对原因不敢兴趣,看到这里就可以了。下面我会简单解释下这么做的一些原因。


首先,先说说传统IT服务类项目。类似,电信,政企,银行,XXX管理系统,XXX运维系统。

这类项目往往是国企,事业单位,外包,公司内部,系统表现就是低频高熵(即:系统的并发和用户量不高,但是每次请求返回的数据量较大)。这类项目由于用户少,系统压力并不是特别大。采用复杂的sql语句去直接把压力扔给数据库,并不会有太大的问题。

另一方面,由于外包项目和内部系统,往往存在开发周期短,资金供给不太足,所以一般会采用这种较快的开发方式。复杂的数据处理,逻辑过滤,都会一股脑的扔给数据库去处理。但是,单单从技术角度看,从系统性能和单机的用户容量上看,这么做,显然不是特别科学。完全可以用更少的机器,去支持更多的用户。


其次,常见的互联网技术架构。类似在线电商,O2O,生鲜等。

互联网公司由于大多系统是高频低熵(即系统的并发和用户量巨大,但是每个用户返回的数据只和自己订单相关,数据量少)。而高并发的系统瓶颈,往往在网络IO和磁盘IO上。数据库的吞吐,很快会成为系统性能的瓶颈。因此,对于高并发大流量的系统,我们要尽可能的减少数据库压力,使单次查询的时间尽可能短。缓存和分库分表等一系列操作,都是为了尽可能的减少数据库的读写压力。

这里贴上一张常见的互联网公司数据切片的操作。

最后,作为技术人员,我推荐采用互联网技术架构的思路去解决项目中的数据库问题。以最少的成本,性能最好的优化代码,才能提高相应的技术能力。如果所有问题丢sql,性能不够加机器,同样能解决问题,但显然不是一个技术人员应有的追求。


当然至于代码的可读性,可维护性等其他的,这些也算是原因之一,但并非是主要原因。

对互联网公司技术架构设计有兴趣,欢迎查看我之前的回答,里面有相关的公司架构设计发展的历程。有问题随时讨论,谢谢。

评论0 赞同0
  •  加载中...
khs1994

khs1994

回答于2022-06-28 14:09

不应该,业务在service里写就好了,甚至join操作都不应该,我们的分布式数据库都不支持join,因为没必要

评论0 赞同0
  •  加载中...
MorePainMoreGai

MorePainMoreGai

回答于2022-06-28 14:09

首先复杂的逻辑写进sql,会大大减少业务逻辑和业务代码的编写,但1.可读性不强,2.不易扩展,3.不好维护,建议视情况而定。另外sql编写不宜关联太多表影响性能容易出现慢查询导致系统崩溃。

评论0 赞同0
  •  加载中...
zsy888

zsy888

回答于2022-06-28 14:09

建议复杂的sql写入程序里面,程序可以集群部署,分散应用程序压力,避免大流量压力直接打到数据库服务器,直接导致数据库宕机。

评论0 赞同0
  •  加载中...
Brenner

Brenner

回答于2022-06-28 14:09

复杂的逻辑怎么写进sql中?

sql是对数据库管理系统操作数据表的语言命令,复杂的逻辑是对不同sql语句的调用,难道能写进去?

再者编程的一大特点就是高内聚,低耦合,单一原则,一个逻辑一段代码执行一个功能,你非要耦合到一块,后期怎么维护,怎么升级?

评论0 赞同0
  •  加载中...
Fundebug

Fundebug

回答于2022-06-28 14:09

是否应该将复杂的逻辑写进sql中,取决于以下要素:

1、是不是要面对多个应用的调用?例如:A应用和B应用都需要调用的,直接写到SQL中是可以的,可以避免多应用之间重复编码,更新同步不及时等;如果只在一个应用或模块中调用,不建议写进SQL中,毕竟SQL语言的灵活性不如市面多数开发语言;


2、是不是需要考虑业务逻辑的安全性?在某些对业务逻辑有保密性要求的应用,直接写到SQL中是可以的,有助于减少应用开发过程中的业务逻辑安全风险;


3、逻辑变化程度?对于经常需要变更的逻辑,写到SQL中是不明智的。SQL编写效率,测试效率都不如市面多数开发语言。


4、项目开发团队的能力偏向?如果项目中,团队主要成员倾向于将复杂的逻辑写进sql中并且其他(她)成员没有能力完成业务逻辑时,就应该将复杂的逻辑写进sql中,加快项目推进与可靠性。

评论0 赞同0
  •  加载中...
ninefive

ninefive

回答于2022-06-28 14:09

用数据库处理业务逻辑是非常好的做法,但是把业务逻辑写进SQL文就不值得推荐了。

  • 消耗很多精力去拼凑SQL文,会使得程序可读性变差,而且每次都要拼一大段SQL文,再提交给数据库去编译执行,这是效率很低的做法。
  • 有些程序为了避免出现这种情况就把大量数据读进来,在本地进行筛选。这种做法又耗费了大量的网络资源和内存资源,也是不可取的。
  • 比较好的做法是,用数据库的视图预先实装SQL文,这样既可以在数据库上处理业务逻辑,还可以用多少取多少,效率很高。不少高级数据库还提供了存储过程,这样就可以方便地把追加和更新数据的操作也集成到数据库里。

数据库可以直接对应各种业务模型,代码简单明了,省去了很多内存操作和多余的流程控制逻辑。实际开发中应该最大限度地把这些优势发挥出来。

评论0 赞同0
  •  加载中...

最新活动

您已邀请0人回答 查看邀请

我的邀请列表

  • 擅长该话题
  • 回答过该话题
  • 我关注的人
向帮助了您的网友说句感谢的话吧!
付费偷看金额在0.1-10元之间
<