等值 JOIN 的分类(JOIN 简化与提速系列 2)

ops/2024/12/21 22:46:58/

二. 等值 JOIN 的分类

我们来考察下面三种等值 JOIN:


1. 外键关联
表 A 的某个字段和表 B 的主键字段关联(所谓字段关联,就是前一节说过的在等值 JOIN 的过滤条件中要对应相等的字段)。A 表称为事实表,B 表称为维表。A 表中与 B 表主键关联的字段称为 A 指向 B 的外键,B 也称为 A 的外键表。

这里说的主键是指逻辑上的主键,也就是在表中取值唯一、可以用于唯一确定某条记录的字段,不一定是在数据库表上建立过的主键。

外键表是多对一的关系,且只有 JOIN 和 LEFT JOIN,而 FULL JOIN 非常罕见。
典型例子:商品交易表和商品信息表。

显然,外键关联是不对称的。事实表和维表的位置不能互换。

  1. 同维表
    表 A 的主键与表 B 的主键关联,A 和 B 互称为同维表。同维表是一对一的关系,JOIN、LEFT JOIN 和 FULL JOIN 的情况都会有,不过在大多数数据结构设计方案中,FULL JOIN 也相对少见。
    典型例子:员工表和经理表。
    同维表之间是对称的,两个表的地位相同。同维表还构成是等价关系,A 和 B 是同维表,B 和 C 是同维表,则 A 和 C 也是同维表。

  2. 主子表
    表 A 的主键与表 B 的部分主键关联,A 称为主表,B 称为子表。主子表是一对多的关系,只有 JOIN 和 LEFT JOIN,不会有 FULL JOIN。
    典型例子:订单和订单明细。
    主子表也是不对称的,有明确的方向。
    在 SQL 的概念体系中并不区分外键表和主子表,多对一和一对多从 SQL 的观点看来只是关联方向不同,本质上是一回事。确实,订单也可以理解成订单明细的外键表。但是,我们在这里要把它们区分开,将来在简化语法和性能优化时将使用不同的手段。

我们说,这三种 JOIN 已经涵盖了绝大多数等值 JOIN 的情况,甚至可以说几乎全部有业务意义的等值 JOIN 都属于这三类,把等值 JOIN 限定在这三种情况之中,几乎不会减少其适应范围。
仔细考察这三种 JOIN,我们发现所有关联都涉及主键,没有多对多的情况,是不是可以不考虑这种情况?

是的!多对多的等值 JOIN 几乎没有业务意义。

如果两个表 JOIN 时的关联字段没有涉及到任何主键,那就会发生多对多的情况,而这种情况几乎一定还会有一个规模更大的表把这两个表作为维表关联起来。比如学生表和科目表在 JOIN 时,会有个成绩表把学生表和科目表作为维表,单纯只有学生表和科目表的 JOIN 没有业务意义。
当写 SQL 语句时发现多对多的情况,那大概率是这个语句写错了!或者数据有问题!这条法则用于排除 JOIN 错误很有效。

不过,我们一直在说“几乎”,并没有用完全肯定的说法,也就是说,多对多在非常罕见的情况下也会业务意义。可举一例,用 SQL 实现矩阵乘法时会发生多对多的等值 JOIN,具体写法读者可以自行补充。

SQL 中笛卡尔积再过滤这种 JOIN 定义,确实非常简单,而简单的内涵将得到更大的外延,可以把多对多等值 JOIN 甚至非等值 JOIN 等都包括进来。但是,过于简单的内涵无法充分体现出最常见等值 JOIN 的运算特征。这会导致编写代码和实现运算时就不能利用这些特征,在运算较为复杂时(涉及关联表较多以及有嵌套的情况),无论是书写还是优化都非常困难。而充分利用这些特征后,我们就能创造出更简单的书写形式并获得更高效的运算性能,后面的内容中将会逐步加以说明。

与其为了把罕见情况也被包括进来而把运算定义为更通用的形式,还不如把这些情况定义成另一种运算更为合理。


http://www.ppmy.cn/ops/143871.html

相关文章

中阳动态分散投资策略:构建多元化投资组合的科学路径

在现代投资管理中,动态分散投资策略逐渐成为投资者实现风险控制和收益优化的重要方式。中阳凭借多年市场经验,结合数据驱动的投资模型,为客户提供专业化、多元化的资产组合方案,在复杂的市场环境中寻求稳定的增长。 一、动态分散投…

学习使用jquery将tr一整行设置为不可用状态

学习使用jquery将tr一整行设置为不可用状态 当你点击任何一个元素时,它会添加一个disabled类到该元素上,从而通过CSS使整行变为不可点击(即不可用状态)。pointer-events: none;属性确保了用户不能与表格行中的任何元素互动&#x…

前端小白学习之路-Vben探索 vite 配置 - 1/50

目的 为ApiHug 寻找一个前端解决方案前端背景知识缺乏整盘操作:前后全栈80% 中小规模项目提效 30% 全员全栈快速构建高度模块化AI Native... 所以 裸学前端高举高打,直接从复杂项目拆解AI 助手高度依赖后端癖严重,高度模块, 结构化…

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导

Sigrity System Explorer Snip Via Pattern From Layout模式从其它设计中截取过孔模型和仿真分析操作指导 Sigrity System Explorer Snip Via Pattern From Layout模式支持从其它设计中截取过孔模型用于仿真分析,同样以差分模板为例 具体操作如下 双击打开System Explorer软件…

*【每日一题 基础题】 [蓝桥杯 2024 省 B] 好数

[蓝桥杯 2024 省 B] 好数 好数 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位……)上的数字是奇数,偶数位(十位、千位、十万位……)上的数字是偶数,我们就称之为“好数”。 给定一…

防火墙内局域网特殊的Nginx基于stream模块进行四层协议转发模块的监听443 端口并将所有接收转发到目标服务器

在一些特殊场合下, 公司内部网络防火墙限制, 不能做端口映射, 此时可以使用nginx的做从四层协议转发, 只走tcp/ip协议, 而不走http方式, 可以做waf设置, 就可以做443, 或其它端口, 从而达到被直接转发到远程服务器效果 机房只映射了一个IP:22280, 而需求是这个SDK只能通过…

Java系统对接企业微信审批项目流程

若依做的一个系统需求需要对接企业微信的人员去审核订单 回款之类,以下是详细步骤. 1.首先登入企业微信管理后台: 企业微信 2.找到应用管理 3.自建一个应用 4.这些数据都可以拿到 5.配置可信Ip 6.进入有两种方法让你去配置 ,第一种用公司的…

clickhouse-介绍、安装、数据类型、sql

1、介绍 ClickHouse是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),使用C语言编写,主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。 OLAP(On-Line A…