逻辑大量的写在 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 的也很多。
18714 次点击
所在节点    Java
244 条回复
night98
2022-02-21 22:50:41 +08:00
给楼主提个建议,要么跑,要么当 leader 禁止此类写法,否则都是打工的,没必要提这个,有心思写好代码的同事,你不说他也会改,没心思的你说了反而得罪人家,要么赶紧跑路
Elietio
2022-02-21 23:12:28 +08:00
这算啥,我这一堆一二百行的 SQL ,需求整天变来变去,反反复复改了 N 次
chineselittleboy
2022-02-21 23:22:34 +08:00
能不能贴一下实现同样逻辑的代码
movieatravelove
2022-02-21 23:38:12 +08:00
互联网公司和传统 IT 公司的做法本身就是不同的,场景不一样,互相觉得对方是傻 x 倒也很正常
IvanLi127
2022-02-22 00:09:05 +08:00
你的示例,看起来问题不大
levelworm
2022-02-22 01:00:06 +08:00
@leafre 这个问题是数据库设计的问题了。这么多 join 是查什么呢?好奇。
wangritian
2022-02-22 01:03:25 +08:00
以前看过有人吐槽教务系统的 sql ,鼠标滚轮滚坏了都拉不到底
wanacry
2022-02-22 01:43:32 +08:00
楼主你这培训班水平就别来秀了
seanzxx
2022-02-22 03:01:30 +08:00
@vibbow 单词都看得懂,合在一起完全看不懂,即使有中文的注释
dayeye2006199
2022-02-22 03:27:01 +08:00
LZ 了解过存储过程吗?这个可能比较符合 “业务逻辑“ 写在 sql 里面的定义。
多表联查其实也不算什么业务逻辑。

要看贵公司做什么业务的。需要大量水平扩展的,放太多重计算任务在数据库侧确实不太合适;如果是做 ERP 这类需要强关系建模的,每个表不设外键,禁止 join ,就看会不会被公司打死。。

软件公司也不是只有 2c 这一种的。
msg7086
2022-02-22 04:05:56 +08:00
遇到这种写法,我觉得最主要就提 3 个问题。
1. 这么写以后团队里是否有复数人有能力修改。公交车因素是很重要的,如果团队里只有一个人有能力这么写,就不能这么写。
2. 数据库是否需要横向扩展。应用服务器从 1 台变成 1000 台是比较容易的,数据库服务器从 1 台变成 2 台都比较难。这种结构能不能支撑以后的规模扩展?
3. 自动化测试能不能保证。大家都知道,自动化测试可以大幅减少工作量,降低加班时间和炸锅几率。超长 SQL 能否用足够的测试去覆盖各种情况?如果不可以,那么拆分成应用层逻辑就是值得的。我觉得存储过程不是很大的问题,但是存储过程也应该可自动化测试才行。
LeeReamond
2022-02-22 04:39:26 +08:00
所以这<if></if>语法是啥玩意,标准 sql 语法里有这个吗?
akira
2022-02-22 05:01:24 +08:00
看起来像是菜单权限的东西,这种数据量有限的东西,随便折腾的啊.
有一说一,程序员做的首要事情是让东西跑起来,其次才是需要考虑针对不同的情况进行处理。
cassyfar
2022-02-22 05:35:35 +08:00
这是什么妖风邪气啊

不单单是可读性差,主要在于水平扩展性差。不过如果你的服务 qps 不高,也不用太纠结。。。只是确实看着很捉急。
aragakiyuii
2022-02-22 08:09:09 +08:00
@LeeReamond #89 java mybatis 😂
moxiaowei
2022-02-22 08:29:20 +08:00
@l00t 你特么傻逼 自己不会审题?老子放出来的就是个简单的示例。菜你妈了菜,大过年的逼我喷你!
sjzjams
2022-02-22 08:37:22 +08:00
我是菜鸟 想问这个 sql 哪里写了逻辑???哈哈哈
bthulu
2022-02-22 08:39:48 +08:00
现在都流行低代码了, 我司已经把业务全部重构到 sql 里了, 压根不用写代码了, 改改 sql 就好了, 真爽
sjzjams
2022-02-22 08:43:43 +08:00
@moxiaowei 这个是根据用户查询菜单和角色吧。楼主你要是贴个 10 来次 left join 的 sql 这样估计更能说明问题,站你的人会更多
l00t
2022-02-22 08:43:56 +08:00
@moxiaowei 嚯,菜狗急了。

我说你丫才多少点见识啊,就搁那逼逼可读性。是不是你看不懂看着累的就叫可读性不好?你咋不去大街上随便拉个人过来评评你自己的代码,问问他能不能看懂呢?

还特么数据库限制用 join ?关系型数据库就是为 join 而生,你不用 join ,那你为什么不直接用文本文件?

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

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

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

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

© 2021 V2EX