阿里规范不建议多表Join,可这SQL要怎么写?

阿里开发手册的描述,禁止多表join:html

阿里规范不建议多表Join,可这SQL要怎么写?

手册上写着【强制】,相信不少同窗项目里面的代码都不知足这个要求。mysql

可是关键问题是:不用join,这SQL究竟要怎么写?!sql

分解关联查询数据库

即对每一个要关联的表进行单表查询,而后将结果在应用程序中进行关联。下面的这个查询:编程

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后面的参数可能会过多,可见这个方案的通用性其实很是有限。并发

打破范式标准高并发

建议建表的时候,就把这些列放在一个表里,好比一开始有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了,查询的性能就能够提升不少了。post

任何的规范都是在特定状况下的某种妥协,脱离了这个环境,就不必定成立了。性能

须要说明的是,这种脱离范式的设计,是互联网业务在设计高并发表时惯用的作法!

具体问题具体分析

最后,建议具体问题具体分析,即便多表Join在阿里规范是强制不容许的,但好比在管理后台这类并发量很低的业务场景下,依然是能够进行多表Join操做的!

多表Join并不必定是很Low的作法,在错误场景下多表Join才是很Low的作法!

本文来自木庄网络博客> 阿里规范不建议多表Join,可这SQL要怎么写啊?

相关文章
相关标签/搜索