你们对禁止使用 SELECT *有什么看法?我被恶心到了...

2021-12-28 17:49:46 +08:00
 retrocode

七八年的老项目,一个表几十个字段,随便一条 SQL 又臭又长,二十几行的 SQL 有十行都是各种字段,然后各种嵌套看的我眼睛都快瞎了

关键还是在 JAVA 中用字符串拼接然后到处复制粘贴,这改一个字段那改一个字段这种,真正贯彻了没有一个多余字段这种概念.

用*换取来的那点性能真的值得做到这种地步吗....

5040 次点击
所在节点    问与答
33 条回复
clf
2021-12-28 17:51:39 +08:00
一般我们都是用 ORM 框架自动转换的……

还有就是写 SQL 的时候用 navicat 里的查询编辑器会自动生成全部字段的。所以……
kop1989
2021-12-28 17:53:07 +08:00
这就属于 DAO 在实现的时候,没有充分贯彻单一职责原则。
不用*是对的,但没有按需取字段,就是白忙活。
retrocode
2021-12-28 17:59:52 +08:00
@clf #1 讲真我看那代码就觉得像是先写的 sql 然后直接粘贴进项目的,然后 java 自动截段换行.阅读起来太痛苦了,非在这个项目上干了 2 年的老哥驾驭不了


@kop1989 #2 他们就是按需取字段把我恶心到了, 一个 file_path 都专门写个 if 判断下在加
potatowish
2021-12-28 18:09:55 +08:00
一个表几十个上百个字段,select*性能是会有点影响的,把需要的字段列出来维护又比较麻烦,这时候就可以考虑水平拆分,在单一职责原则下,减少单个表的字段数量,然后再使用 select*,字段减少了,对性能影响可以忽略不计
clf
2021-12-28 18:22:20 +08:00
@retrocode #3 其实正常。我还遇到过大部分都是调存储过程的,得去写存储过程。然后存储过程里的 SQL 更加狂野。基本靠老带新才能接手。
gearkey
2021-12-28 18:26:39 +08:00
这。。表设计得不大好吧,如果是比较大的项目,分行写的基础上也把字段分类整理一下,最好加点注释,就优美了
melkor
2021-12-28 18:41:33 +08:00
这些字段什么情况要用哪些,应该定义出语义化的接口,这样就不用*了
retrocode
2021-12-28 18:54:10 +08:00
@clf #5 这么狂野的我 19 年做过,是个仓储项目,当时负责 DBA 的老哥跟我炫耀他们系统一个表 200 个字段后台只需按需启用接口,最后我们只需要调用 SP 即可.

整个项目全是存储过程,业务逻辑全在 SQL 里,看着就头大.

幸运的是当时我只做前端不用碰 SQL...
Goooooos
2021-12-28 19:03:07 +08:00
@retrocode #8 之前有人问为什么不用存储过程来写逻辑
wanguorui123
2021-12-28 22:32:36 +08:00
一个表字段过多就不太合理
zzzain46
2021-12-28 22:41:45 +08:00
@clf 老哥请问 navicat 这个自动生成怎么操作的,求指教
lovedoing
2021-12-28 23:41:03 +08:00
禁用 select *是 SQL 规范的基本原则
chihiro2014
2021-12-29 00:31:46 +08:00
JPA 的 projection 就可以按需取字段,非常方便
lululau
2021-12-29 00:38:06 +08:00
active record 框架它不香吗,我就一直很好奇像 MyBatis 这种开发体验几乎和写原始 SQL 一样的框架,怎么就成为中国 Java 开发的事实标准了的
h82258652
2021-12-29 09:01:18 +08:00
写个鸡儿 sql ,orm 香爆了
我公司前几天才发生过数据库表字段名字改了,代码里有 sql 漏改的情况
RedBeanIce
2021-12-29 09:05:25 +08:00
xml 与 resultmap
weixiangzhe
2021-12-29 09:10:07 +08:00
我觉得不用*还比较安全, 保不齐哪天加了个私密的字段就一并带上去了
dddd1919
2021-12-29 09:15:12 +08:00
@lululau 设计不行,只能靠这种半 ORM 来实现一些 ORM 无法满足的需求,比如疯狂 join
ferock
2021-12-29 09:35:30 +08:00
论框架中 sql map 的重要性
onhao
2021-12-29 09:48:32 +08:00
单条数据的获取 * 无任何问题, 但是多行数据的获取就要慎重用 *了
这是使用 mysql 趟过的一些坑。https://wuhao.pw/category/mysql/

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

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

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

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

© 2021 V2EX