逻辑大量的写在 sql 语句里

2022-02-21 16:40:54 +08:00
 moxiaowei

今天看了下同事写的代码,才发现他居然喜欢把大量的逻辑写在 sql 语句里,跟他讲了下,他说是以前同事教的,我认为这样写可读性实在太差了,但是他也不愿意听我的!想听听各位大佬怎么讲。 下面是一段 sql

      SELECT
        m.id,
        m.menuname,
        m.link,
        m.parent_id,
        m.menutype,
        m.sort
--         CASE
--         WHEN pm.parent_id > 0 THEN
--         1 ELSE 0
--         END hasChildren
        FROM
        menu m
--         LEFT JOIN ( SELECT DISTINCT parent_id FROM menu ) pm ON pm.parent_id = m.id
        WHERE
        m.is_deleted = 0
        <if test="userId !=null and userId !=''">
            and m.id in (SELECT DISTINCT
            rm.menu_id
            FROM
            role2menu rm
            LEFT JOIN role r ON r.id = rm.role_id
            LEFT JOIN user2role ur ON ur.role_id = r.id
            WHERE
            rm.is_deleted = 0
            AND ur.user_id = #{userId} )
        </if>
        ORDER BY
        m.sort

这只牵扯到 3 张表,就这么多 left join ,我后面又去翻了翻 10 来次 left join 的也很多。
18715 次点击
所在节点    Java
244 条回复
Mandelo
2022-02-22 09:39:30 +08:00
#101 楼主破防了。。。你发出来的我没看到任何代码逻辑,你可能没见过我同事那种上百行的存储过程
moxiaowei
2022-02-22 09:40:07 +08:00
说我素质差没问题。但是,一群彪炳自己素质高的,张口闭口菜鸡菜鸡的,我菜鸡我拿你工资了?而且,我没说 10 几个 left join 我看不懂,我只是觉得可读性差,换做我,超过 3 个 left join 的,我会写到代码里,而不是死堆 sql 语句,导致后续有人离职项目维护困难。我的标题写的很明确,只是个小实例,更复杂的我没贴出来!我只是想征求下大家的意见,这么写有没有问题!大家的时间都很宝贵,没必要在这儿喷。
Dockerfile
2022-02-22 09:41:11 +08:00
@moxiaowei 你是领导,那你同事不愿意听你的? 你到底是不是领导啊
yibo2018
2022-02-22 09:42:00 +08:00
sql 只做基本的功能,业务代码去组合,这样不好吗?否则你一个业务对应一个 sql ,先不说 sql 一定不能覆盖所有业务,其次 sql 的改动涉及到索引,覆盖等问题产生慢查询,死锁问题,都不考虑的?

好多人喷楼主,2 个 join 怎么了,就难懂吗?这不是关键呀,首先多几个 for 循环是没 SQL 查直接快,那又怎样,这根本不会是瓶颈,反而 MySQL 复杂之后引发的各种死锁,慢查询才是瓶颈
Baloneo
2022-02-22 09:42:03 +08:00
@moxiaowei 支持 LZ
moxiaowei
2022-02-22 09:43:28 +08:00
@Jwyt 哎 中途升的,不是自己培养的人,我跟他说,他回是之前同事教的,之前的同事写了 10 来年 java 了,我目前也不好说啥。
moxiaowei
2022-02-22 09:45:47 +08:00
喷我素质差,我已经认了,但是麻烦往上翻翻 @l00t 这个人的留言,张口就是菜狗。我真的很无语。
lipaa
2022-02-22 09:49:04 +08:00
仁者见仁智者见智 其实都行 我也觉得不复杂 如果没什么效率问题完全可以放 sql 里.放 java 代码不一定比这简洁 性能问题我估摸着也不会有 不是非黑即白的
deplivesb
2022-02-22 09:50:23 +08:00
菜狗就是菜狗,还不让人说?干了 8 年还是外包,不是菜狗?
lipaa
2022-02-22 09:50:48 +08:00
@moxiaowei 可能因为你这种事他遇到过改了呗 其实都可以为啥要听你的 你来写不就完事了 让别人该首先要确定自己一定是对的 或者证明别人错了
SuperXRay
2022-02-22 09:52:14 +08:00
@moxiaowei 贴一下 sql 写法和 java 代码写法的对比,更有说服力,就拿十几个 join 的那个例子
raptor
2022-02-22 09:52:15 +08:00
20 年前流行的 CS 架构都是这样干的啊,存储过程加触发器搞定业务逻辑,客户端就写个 UI 。

老程序员表示这很亲切。

当然这是 20 年前的事情了。
andy2415
2022-02-22 09:52:17 +08:00
谢谢 lz 让我开开心心的摸了一早上鱼
yuancoder
2022-02-22 09:52:44 +08:00
跑路吧,后期完全没法维护了
ltruntu
2022-02-22 09:53:18 +08:00
能跑不就行了 写的再好,能升职加薪么 咋老有人觉得别人的代码都是屎 ,资本社会
zhaol
2022-02-22 10:04:41 +08:00
OP 是举个例子,就怼着例子说 OP 看不懂并且菜?有些人真的是没脑子或者秀优越
TUNGH
2022-02-22 10:04:55 +08:00
@Livid 举报楼主喷子
moxiaowei
2022-02-22 10:09:51 +08:00
@deplivesb ????????我又惹你了?
daimubai
2022-02-22 10:13:49 +08:00
不是#58 先喷人的吗
hhjswf
2022-02-22 10:16:25 +08:00
这也没有业务逻辑啊,就是单纯的查表...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/835439

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX