逻辑大量的写在 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 条回复
moxiaowei
2022-02-22 08:48:19 +08:00
@l00t 来秀你的智商下限?真不想跟傻逼多说什么?去问问你的 leader 吧,你这么干没一个公司能在你手下活着!害人害己,毒瘤。
moxiaowei
2022-02-22 08:49:12 +08:00
@sjzjams 我只是举个简单的示例而已,有些没脑子也不审题,就直接开喷。
l00t
2022-02-22 08:52:24 +08:00
@moxiaowei 笑死。问 leader ,你的 leader 跑我这来是谁领导谁都还难说。你是对业界一无所知。我就这么说吧,大把大把的公司,大把大把的项目都是这么写出来的,从政府到金融到电信到一般企业 OA 乃至到你上学时的选课系统,人家都活得好好的。
moxiaowei
2022-02-22 08:55:15 +08:00
@l00t 对不起我司的 leader 就是我,我就是不允许。我不管别人(你)怎么写,怎么做,我希望我司在我的领导下,不至于代码是一坨屎!我也不觉得你的水平能有多高,至于谁领导谁,你要领导我,你也不配!懂么?
sfqtsh
2022-02-22 08:55:36 +08:00
@Livid 举报#101 楼
liunaijie
2022-02-22 09:03:43 +08:00
你说这样不好, 那你拿出一个方案来, 大家讨论讨论? 只要回复跟你不一致, 你就开喷, 你这是什么脑子.
supuwoerc
2022-02-22 09:06:43 +08:00
@Livid 这里有人开喷啦!~
krixaar
2022-02-22 09:08:54 +08:00
不用连表或者子查询的话,打个比方我这整天要跑营业数据做分析的:
1 、按时间跑出来订单 id
2 、按订单 id 跑订单各项内容的 id
3 、按订单各项内容的 id 分别一个查询去取对应的内容
4 、拼起来发出去
现在一堆 left join 做一个 materialized view 让它自己刷新谁想要数据直接一行 select 出去它不香吗……
fanchenio
2022-02-22 09:11:20 +08:00
不用 join 的话,那还要 mysql 干什么啊,直接用 mongodb 得了。
18500592934
2022-02-22 09:14:24 +08:00
这样的 sql 还好,这才几张表啊, 我司都是七八张表起步联查,而且你要拆开就会说你怎么查好几次数据库啊???
所以啊 领导让咋样就咋样吧
jackchenly
2022-02-22 09:21:03 +08:00
我看到一个菜鸡急眼了,呵呵
CallMeReznov
2022-02-22 09:22:33 +08:00
你认为代码不好,那是你的问题.
因为给钱的的人觉得有问题才是真正的问题.
dengji85
2022-02-22 09:23:03 +08:00
我做 erp 的,逻辑也写 sql 实现,以前还经常写存储过程,但实在太难维护了</br>
用 sql 实现时一段业务 sql 尽可能功能明确,写好注释就行了,有时一段简单 sql 可以实现的,java 代码可能又臭又长,
wupher
2022-02-22 09:25:08 +08:00
Client-Server 时代的设计风格。那时大家 Client 使用诸如 VB VC Delphi 等编写。但上述语言或者平台只负责客户端的样式与展现,业务逻辑多使用存储过程或者 SQL 存放于 DB 中运行。

好处是更新业务逻辑,只要修改 SQL 即可,无需上述平台重新编写,编译,打包,升级。缺点么,那也是 N 多的。比如 SQL 语言不是一门 OO 语言,业务描述能力在某些场景就会非常难用。SQL 基本谈不上并发,写操作,尤其是存储过程运行涉及临时表,经常有并发问题,而你有 100 个 CPU 都没用。

进入 Web-Service 时代以来,这种设计基本被大家放弃,更多使用编写语言来实现业务逻辑的封装与维护。
Morton996
2022-02-22 09:26:37 +08:00
真是又菜素质又差,十几个 left join 就看不懂了,这种理解能力能 hold 住 10 万行以上代码的系统不
superchijinpeng
2022-02-22 09:28:48 +08:00
没什么问题吧,不过楼主素质真的差
Aumujun
2022-02-22 09:29:43 +08:00
那么问题来了,几百上千行的 SQL ,你用代码来实现就一定是好的?
weizhen199
2022-02-22 09:32:18 +08:00
@yazinnnn 弄分布式的数据库呗。哪有这么多规矩
nicebird
2022-02-22 09:36:44 +08:00
找领导完事。
javen73
2022-02-22 09:38:11 +08:00
这没什么吧...相反我更讨厌在代码里看一堆 if 。
什么玩意儿是叫把逻辑写在 SQL 里?<if> 这种标签不是 mybatis 解析的东西么?什么时候轮到数据库来解析了

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

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

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

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

© 2021 V2EX