阿里开发规范限制多表join的时候怎么实现 跨表的字段筛选

在阿里开发规范中,‌当需要跨表进行字段筛选时,‌可以通过分解关联查询和打破范式标准两种方法来实现。‌

  1. 分解关联查询:‌这种方法涉及到对每个要关联的表进行单表查询,‌然后将结果在应用程序中进行关联。‌例如,‌一个原本使用JOIN连接的查询可以分解为多个单独的查询,‌每个查询针对一个表进行,‌然后将这些查询的结果在应用程序中组合。‌这种方法虽然可以避免直接使用JOIN,‌但存在明显的局限性,‌即当需要关联的表较多时,‌查询的复杂性会显著增加,‌且IN子句中的参数可能会过多,‌导致查询效率低下。‌

  2. 打破范式标准:‌另一种方法是建议在建表时就考虑查询的需求,‌将相关的字段放在同一张表中。‌例如,‌如果原本有三个表(‌student, class, student_class)‌分别存储学生和班级的信息,‌并且需要通过JOIN来获取学生的班级信息,‌那么可以考虑使用一张大表(‌student_class_full)‌来存储所有必要的信息,‌即使这意味着某些字段会被重复存储。‌这种方法虽然可以提高查询性能,‌但会增加数据的冗余,‌并且违反了数据库设计的范式原则。‌

这两种方法都是在特定情况下的妥协,‌每种方法都有其适用的场景和限制。‌在实际应用中,‌需要根据具体的业务需求和数据模型来选择最合适的方案

 

参考论证

参考1:https://www.163.com/dy/article/ET78H1G50511BVK1.html

参考2:https://zhuanlan.zhihu.com/p/105024121

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

![阿里规范不建议多表Join,可这SQL要怎么写?](http://img.muzhuangnet.com/nojoin3.jpg)

手册上写着【强制】,相信很多同学项目里面的代码都不满足这个要求。

但是关键问题是:不用join,这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了,查询的性能就可以提高很多了。

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

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

具体问题具体分析

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

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

posted @ 2024-08-06 14:26  一木人生  阅读(69)  评论(0)    收藏  举报