前言

我们先来看一下阿里开发手册的描述:

手册上写着【强制】,但是我相信很多同学项目里面的代码都不满足这个要求。但是关键问题是:不用join,这SQL究竟要怎么写啊!

高性能MySQL

高性能MySQL这本书相信大家都看过,在分解大的查询这部分提到。

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

SELECT * FROM tagJOIN tag_post ON tag_post.tag_id=tag.idJOIN post ON tag_post.post_id=post.idWHERE 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在阿里规范是强制不允许的,但是笔者依然认为,在比如管理后台这类并发量很低的业务场景下,依然是可以进行多表Join操作的!

多表Join并不一定是很Low的做法,在错误场景下多表Join才是很Low的做法!任何东西都不要一杆子打死!

sql join on 多表连接_阿里规范不建议多表Join,可这SQL要怎么写啊?相关推荐

  1. 阿里云 mysql 分表分库_阿里云DRDS分库分表

    以下大部分内容非原创,整理自阿里云官方文档 单库单表 建一张单库单表,不做任何拆分. CREATE TABLE single_tbl( id int, name varchar(30), primar ...

  2. 阿里规范不建议多表join,可这SQL要怎么写啊?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 前言 我们先来看一下阿里开发手册的描述 手册上写着[强制],但是肥 ...

  3. oracle中join另一个表后会查询不出一些数据_阿里规定超过3张表,禁止JOIN,为何?

    一. 问题提出 <阿里巴巴JAVA开发手册>里面写超过三张表禁止join,这是为什么? 二.问题分析 对这个结论,你是否有怀疑呢?也不知道是哪位先哲说的不要人云亦云,今天我设计sql,来验 ...

  4. server多笔记录拼接字符串 sql_第四章、SQL Server数据库查询大全(单表查询、多表连接查询、嵌套查询、关联子查询、拼sql字符串的查询、交叉查询)...

    4.1.查询的类型 declare @value as int set @value = 50 select  'age:'as age,2008 years,@valueas va --这种查询时跟 ...

  5. 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式. 之前打算在sqlplus中用执行计划的,但是格式看起来有点乱,就用Toad 做了3个截图. 从3张图里我们看到了几点 ...

  6. mySQL学习记录(局域网连接/基础查询/条件查询/常见函数/窗口函数/表连接/子查询/插修删建表)

    一些基础概念 DB 数据库 存储数据的容器 DBMS 数据库管理系统 又称数据库软件.产品如mysql/oracle/db2/sqlserver SQL 结构化查询语言 是所有的DBMS都使用的一种D ...

  7. mysql分库分表风险_别再问“分库分表”了,再问就崩溃了!

    在谈论数据库架构和数据库优化的时候,我们经常会听到分库分表,分库分表其实涉及到很多难题,今天我们来汇总一下数据库分库分表解决方案. 数据切分 关系型数据库本身比较容易成为系统瓶颈,单机存储容量.连接数 ...

  8. 命令行使用mysql创建表空间_达梦命令行创建表空间

    1.2命令方式创建 到数据库安装目录   cd /home/dmdba/bin 执行创建数据库实例的命令: ./dminit  path=/home/dmdba/data db_name=数据库名 i ...

  9. element-ui表单_每日UI挑战强加-登录表单(分步教程)

    element-ui表单 A step by step journey to create a good design from the daily UI challenge 一步步走,从日常的UI挑 ...

最新文章

  1. 国内外有哪些漏洞信息发布平台?
  2. 2020下半年新机最新消息_2020年下半年即将发布的手机,你们期待吗
  3. Jemeter组件介绍(四)
  4. python的property用法_python @property的用法及含义全面解析
  5. 快别发语音了! | 今日最佳
  6. 无人驾驶五 使用pure pursuit实现无人车轨迹追踪(python)
  7. 样本不均衡的解决方法
  8. 深度学习:batch_size和学习率 及如何调整
  9. 聊聊FluxFlatMap的concurrency及prefetch参数
  10. 奥创手机群控安装到魅蓝3的流程
  11. c语言求最长单调子序列,设计一个O(n2)时间算法,找出由n个数组成的序列的最长单调递增子序列...
  12. UE4 全局变量的应用(蓝图)
  13. Cesium加载建筑物模型(shp转Geojson\3Dtiles)
  14. eve-ng中模拟飞塔HA测试实验及理论
  15. 软考高级软件架构师学习笔记二(软件工程)
  16. 如何相对正确的安装windws桌面操作系统。
  17. 微信小程序二维码识别
  18. 校园网常见故障及解决方案
  19. 独立IP和共享IP的区别以及各自的优势有哪些
  20. 电力系统暂态分析复习

热门文章

  1. Python 循环中的陷阱
  2. Python 基础中20 个小技巧
  3. python 超时重试方法
  4. oracle中存在函数吗,Oracle中的函数
  5. C++模板的概念<>(泛型编程)
  6. numpy数组如何将数组中的元素批量保留小数(或精确到指定位)?np.around()函数(与np.round()函数等价?)
  7. PyQt5 官方文档
  8. UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 43: illegal multibyte sequence
  9. pycharm 怎么对代码进行性能分析,消耗时间time (Run -- Profile 'xxxx')
  10. c语言与python的区别