前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一场关于逻辑应该写在哪里的争论No.93

一场关于逻辑应该写在哪里的争论No.93

作者头像
大蕉
发布2018-04-26 17:34:30
1.4K0
发布2018-04-26 17:34:30
举报

先说结论,我支持将逻辑写在 Java 等应用系统中。

观察了一下,传统企业以及绝大部分转型中的企业的 Java 应用中,很神奇的是,他们的开发人员包括我自己以前,大家都非常非常希望使用一个 SQL 来完成所有的逻辑的编写,非常多企业更是把数据库的存储过程和数据库自定义函数来完成。

老实说,这样子确实会提高开发的效率,因为不用写那么多查库聚合的操作,一切都在 SQL 中搞定了。另一方面来看,这确实会让 Java 代码看起来很鸡肋,好像只是把数据从 web 层到数据层的一个管道而已,一切 if else 能写在 SQL 中的都写在 SQL 中了。

我曾经就维护了一个几千行的存储过程,一旦发生问题,排查问题的过程巨艰难。但是呢直接用一个数据库一个功能搞定所有功能未尝不是一件很爽的事情,因为关系型数据库实在是实在是太太太稳定了,一次编写永久运行。

这些关于逻辑应该写在哪里的争论从来没有停止过,不仅仅发生在后端和数据库端,连前后端都经常会发生这种争论。

为什么逻辑应该写在 SQL 中?

我们绝大多数的历史代码都是用存储过程来实现的啊,如果有新需求不往上面做的话,很难兼容原来的逻辑啊啊

前面的人呢是这样写的,我来了看大家都这样写就这样写了

这样写起来很快啊,而且写 Java 代码多难受啊,写 SQL 我自己在数据库开发环境跑一下结果正确我就直接丢到代码中提交了,多爽啊。

SQL 有各种索引和优化策略,说不定跑起来比我们自己写逻辑还快呢。

SQL 慢没关系,它稳定啊,慢就把机器垂直扩展一下好啦,加cpu,加内存,换SSD,加加加绝对可以解决事情的。

诸如此上,云云

为什么逻辑应该写在 Java 中?

数据库中非常复杂的表关联会极大程度拖慢数据库处理每条 SQL 的平均时间,极大程度拖慢数据库 RT,降低了数据库的 RT ,如果逻辑都写在 SQL 中,那么只能进行垂直升级。因为一旦进行水平扩展,那么多机器的非常复杂的分布式表关联,RT 基本不是一个高并发的业务应用的能容忍的。

逻辑写在 Java 或者业务系统中,在应用快速发展的过程中一般都会分库分表的拆分或者自动水平扩展,这时候其实只需要数据库层面做好自己的数据迁移和同步就好了,对于业务层来说是完全无感知的。即使业务非常非常复杂,需要拆应用,其实也非常简单,只需要把对应的 DAO 层的操作拆分出去,换成 RPC 或者其他方式的调用就好了。

如果你的逻辑全部写在 SQL 中,那完蛋了,你这个表基本就没法分表了,因为你的业务逻辑跟数据库的数据完整性是强耦合的,需要一切数据基本都在一个数据库中,这是一件很难受很难受的事情,不信你去问问那些所有业务逻辑全写在 SQL 中的小伙。

我支持哪种模式?

我支持将逻辑写在 Java 等应用系统中。其实原因在上面基本描述完了,第一就是复杂 SQL 的表关联其实跟个人的能力有非常大的关系,如果一个 SQL 写得不好,那是极慢极慢的非常容易把整个数据库拖慢的。第二就是维护这些 SQL 也是一件很难受的事情,因为你完全不知道这个 SQL 背后的数据流转是怎样的,你只能根据自己的猜测去查看 SQL 中的 bug,Java 应用好歹还能 debug 一下还有打点看看数据不是?如果逻辑写在 Java 中那么其实你的 DAO 层只需要编写一次,但是可以永久使用,基本不会在这一层浪费很多的时间(用过 ibatis 的都知道改了 SQL 需要重启应用吧?)。第三就是逻辑都写在 SQL ,中对于分库分表和应用拆分来说是一件非常难受的事情,真的难受。

安康,就吐槽到这里,大家留言跟我聊聊平时的开发模式吧。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 一名叫大蕉的程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么逻辑应该写在 SQL 中?
  • 为什么逻辑应该写在 Java 中?
  • 我支持哪种模式?
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档