数据蒋堂 | JOIN简化 - 意义总结

简介: 我们重新审视和定义了等值JOIN运算,并简化了语法。一个直接的效果显然是让语句书写和理解更容易。外键属性化、同维表等同化和主子表一体化方案直接消除了显式的关联运算,也更符合自然思维;维度对齐则可让程序员不再关心表间关系,降低语句的复杂度。

简化JOIN的好处不仅在于此,还能够降低出错率

我们知道,SQL允许用WHERE来写JOIN运算的过滤条件(回到原始的笛卡尔积式的定义),很多程序员也习惯于这么写。当JOIN表只有两三个的时候,那问题还不大,但如果JOIN表有七八个甚至十几个的时候,漏写一个JOIN条件是很有可能的。而漏写了JOIN条件意味着将发生多对多的完全叉乘,而这个SQL却可以正常执行,一方面计算结果会出错(回忆一下以前说过的,发生多对多JOIN时,大概率是语句写错了),另一方面,如果漏写条件的表很大,笛卡尔积的规模将是平方级的,这极有可能把数据库直接“跑死”!

采用简化后的JOIN语法,就不可能发生漏写JOIN条件的情况了。因为对JOIN的理解不再是以笛卡尔积为基础,而且设计这些语法时已经假定了多对多关联没有业务意义,这个规则下写不出完全叉乘的运算。

对于多个子表分组后与主表对齐的运算,在SQL中要写成多个子查询的形式。但如果只有一个子表时,可以先JOIN再GROUP,这时不需要子查询。有些程序员没有仔细分析,会把这种写法推广到多个子表的情况,也先JOIN再GROUP,可以避免使用子查询,但计算结果是错误的。

使用维度对齐的写法就不容易发生这种错误了,无论多少个子表,都不需要子查询,一个子表和多个子表的写法完全相同。

重新看待JOIN运算,最关键的作用在于实现关联查询

当前敏捷BI产品非常火热,各家产品都宣称能够让业务人员拖拖拽拽就完成想要的查询报表。但实际应用效果会远不如人意,业务人员仍然要经常求助于IT部门。造成这个现象的主要原因在于大多数业务查询都是有过程的计算,不大可能直接由不会编程的业务人员独立完成。但是,仍有约三成左右的业务查询并不涉及多步过程,而业务人员仍然无法完成。

这是由于大多数敏捷BI产品(以及多年前流行的OLAP产品)都不支持关联查询。这些产品的工作模式是先由技术人员构建模型,再由业务人员基于模型在界面上进行查询。而所谓建模,其实就是生成一个逻辑上或物理上的单表,业务人员只能在这个单表的范围内查询分析,无论界面做得多么流畅炫酷,在数据获取层面都不可能超越这个事先构建好的单表范围。

用户的查询需求一旦超出了这个单表,需要关联到其它表中数据时,就要由技术人员再次建模。建模实际上要针对不同的关联需求分别实现,我们称之为按需建模。但实际上,有意义的查询绝大多数都有关联需求,技术人员也不可能事先预测所有的关联,就算预测了也不可能把所有的关联可能性都事先做好。结果是,要么建模动作频频发生,要么业务用户没法使用,无论如何,这些敏捷BI产品都会失去敏捷性。

为什么这些BI产品不能支持关联查询呢?因为并不容易,其根源就在于SQL对JOIN的定义过于简单,导致表间关联过于繁琐,超出业务人员的理解能力,直接把数据结构暴露出来由业务用户自己完成JOIN运算是不可能的。有些BI产品在界面协助下有一些改善,在事先定义好维度后,可以让业务人员正确处理没有形成环的关联关系以及同表内没有相同维度的关联情况,全自关联(形成环)和同表同维字段仍需要再建模去解决,这些细节我们也留到讲述维度概念时来再详细讨论。

但是,如果改变了对JOIN运算的看法,关联查询可以从根本上得到解决。回忆前面讲过的三种JOIN及其简化手段,我们事实上把这几种情况的多表关联都看成了单表查询,而业务用户对于单表查询并没有理解障碍。无非就是表的属性(字段)稍复杂了一些:可能有子属性(外键字段指向的外键表),子属性可能还有子属性(多层的外键表),有些字段取值是集合而非单值(子表作为主表的字段)。发生自关联也不会影响理解(前面的例子就是个自关联),同表有相同维度也不碍事(各自有各自的子属性)。在这种关联机制下,技术人员只要一次性把数据结构(元数据)定义好,在合适的界面下,由业务人员可以自己实现JOIN运算,不再需要技术人员的参与。数据建模只发生于数据结构改变的时刻,而不需要为新的关联需求建模,这也就是非按需建模


原文发布时间为:2017-12-2

本文作者:蒋步星

本文来自云栖社区合作伙伴“数据派THU”,了解相关信息可以关注“数据派THU”微信公众号

相关文章
|
SQL 关系型数据库 数据库连接
python库之—psycopg2
python库之—psycopg2
|
2月前
|
传感器 人工智能 边缘计算
宠物识别算法在智能猫窝上的应用:区域预警、Vlog生成与睡眠监测一体化方案
基于边缘计算与多传感器融合,智能猫窝集成宠物识别算法,实现区域预警、Vlog自动生成与睡眠监测一体化。通过AI视觉、毫米波雷达等技术,精准识别宠物行为,助力远程看护与健康管理,提升人宠情感连接,打造智慧养宠新体验。
|
19天前
|
IDE 搜索推荐 开发工具
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
Microsoft Visual Studio 2022 离线安装包 - 简体中文 | 繁體中文 | English
182 3
Visual Studio 2022 Enterprise 17.14.25 Offline (2026 年 1 月更新)
|
2月前
|
弹性计算 数据库连接
阿里云服务器ECS按流量收费标准,公网带宽1GB流量0.8元/GB(中国大陆地域)
阿里云ECS按流量计费,中国大陆多数地域0.8元/GB,青岛0.72元/GB,中国香港1.0元/GB,美国0.5元/GB,日本0.6元/GB,韩国0.8元/GB。仅公网出方向流量收费,内网及入向流量免费,支持设置峰值带宽,按小时结算,多地域价格差异明显,适合流量波动大的业务场景。
457 2
|
Web App开发
Python+selenium 实现自动上传并发布小红书号短视频实例演示
Python+selenium 实现自动上传并发布小红书号短视频实例演示
1469 0
Python+selenium 实现自动上传并发布小红书号短视频实例演示
|
5月前
|
边缘计算 安全 网络协议
计算机网络
计算机网络是数字时代的隐形脉络,从ARPANET到万物互联,重塑社会、经济与文明。它打破时空边界,推动信息革命,也带来安全与伦理挑战。作为现代文明的基石,其未来在于速度与智能,更在于如何以人为本,构建开放、安全、包容的连接世界。
|
10月前
|
JSON 前端开发 Java
彻底搞定 Spring 中的 @PathVariable 和 @ResponseBody
本文深入解析了Spring MVC中`@PathVariable`和`@ResponseBody`的使用方法及适用场景。`@PathVariable`用于从URL路径提取变量,增强REST风格接口的语义性;`@ResponseBody`则将方法返回值直接写入HTTP响应体,适合返回JSON或XML数据。通过多个实际案例,展示了两者在不同场景下的应用,如删除商品、获取商品详情等。文章还总结了最佳实践,帮助开发者更好地理解与运用这两个注解,提升接口设计的清晰度与可维护性。
357 0
|
12月前
|
人工智能 缓存 运维
“云+AI”守护中国年!阿里云为中国邮政、西安政务云、总台春晚重保护航
“云+AI”守护中国年!阿里云为中国邮政、西安政务云、总台春晚重保护航
344 1
|
12月前
|
机器学习/深度学习 算法 PyTorch
从零开始深度学习:全连接层、损失函数与梯度下降的详尽指南
在深度学习的领域,全连接层、损失函数与梯度下降是三块重要的基石。如果你正在踏上深度学习的旅程,理解它们是迈向成功的第一步。这篇文章将从概念到代码、从基础到进阶,详细剖析这三个主题,帮助你从小白成长为能够解决实际问题的开发者。
|
存储 监控 安全
GE-PREDIX 平台的优势
GE-PREDIX平台优势在于其强大的工业互联网能力,提供安全、灵活的数据管理与分析服务,支持应用程序快速开发与部署,助力企业实现智能化转型,提升运营效率和创新能力。