阿里规范不建议多表join,可这SQL要怎么写啊?
2021-01-14 21:47
1256 查看
前言
我们先来看一下阿里开发手册的描述
手册上写着【强制】,但是肥朝相信很多同学项目里面的代码都不满足这个要求。但是关键问题是,不用join,这SQL究竟要怎么写啊!
高性能MySQL
高性能MySQL这本书相信大家都看过,在
分解大的查询这部分提到。
分解关联查询,即对每个要关联的表进行单表查询,然后将结果在应用程序中进行关联。下面的这个查询:
SELECT * FROM tag
JOIN tag_post ON tag_post.tag_id=tag.id
JOIN post ON tag_post.post_id=post.id
WHERE tag.tag = 'mysql';
可以分解成下面这些查询来代替:
SELECT * FROM tag WHERE tag = 'mysql';
SELECT * FROM tag_post WHERE tag_id = 1234;
SELECT * FROM post WHERE post.id in (123,456,567,9098,8904);
但是该方案也会有很明显的问题,就是
in后面的参数可能会过多,可见这个方案的通用性其实非常有限。
知乎
我们看一下知乎数据库大佬李晨曦的回答。(原地址https://www.zhihu.com/question/56236190/answer/153450286)
建表的时候,就把这些列放在一个表里,比如一开始有
student(id, name),
class(id, description),
student_class(student_id, class_id)三张表,这样是符合数据库范式的(第一范式,第二范式,第三范式,BC范式等),没有任何冗余,但是马上就不符合“编程规范“了,那我们可以用一张大表代替它,
student_class_full(student_id, class_id, name, description),这样name和description可能要被存储多份,但是由于不需要join了,查询的性能就可以提高很多了。任何的规范都是在特定情况下的某种妥协,脱离了这个环境,就不一定成立了。
该解决方案的具体做法和利弊肥朝认为说得很清楚了。
说出你的故事
那么,你们公司是否有很多多表join的情况呢?是用哪种方案解决,还是说,直接当做没看到不解决!欢迎留言告诉肥朝。
相关文章推荐
- 阿里开发强制要求的11条SQL编写规范
- 怎么查找执行比较慢的sql语句-DBA给的建议
- 零基础怎么才能学好Java?前阿里P9程序员这样建议
- Sql实践怎么规范sql数据和五大约束.十三
- PL/SQL编码规范的一些建议
- 零基础怎么才能学好Java?前阿里P9程序员这样建议
- 阿里面试:Mybatis中方法和SQL是怎么关联起来的呢?
- Sql实践怎么规范sql数据和五大约束.十三
- 关于Schema设计规范及SQL使用建议
- ORACLE PL/SQL编程之八:把触发器说透(写的太长了,建议没事的时候看,想快速查怎么用触发器的不要看)
- LINQ TO SQL 中的join
- SQL 优化34条建议
- LINQ TO SQL 中的join
- SQL IF..ELSE..在存储过程的使用规范
- 【0037】SQL查询--连接查询--内外连接JOIN,LEFT JOIN,RIGHT JOIN,FULL JOIN
- JPA基础查询,复杂查询,自定义sql查询以及命名规范
- sql 中怎么将A表插入B表中,,去除两张 表中含有的重复数据
- t-sql或mssql怎么用命令行导入数据脚本
- SQL中的join的详细用法!inner join,full outer join,left join,right jion
- 接口 怎么 部署到 阿里服务器的 初步学习知识后期还要完善