上一篇介绍了文氏图与 SQL 的集合的应用,这一篇要介绍的是欧拉图,欧拉图与文氏图不同之处,在於它主要不是用来显示交集关系的。
来看看下面两张图:
上图它呈现了三个集合之间有包含的关系,房子包含 A 房间包含手机,这之间都没有任何交集关系。
上图它呈现了一整个空间中有成功和非成功的分期付款资讯,主要要查询的部分有 2015 - 2017 的年度刷卡资料,里面有个年度、月份的资料子集合。
这一篇想要介绍欧拉图与集合论推理的两个重要的观点,假设集合之间都是包含关系:
1. 小的集合存在你需要的资料,那麽大的集合也会有那笔资料。
2. 大的集合中不存在你需要的资料,那麽小的集合也不会有那笔资料。
听起来很合理,而希望分享这件事的原因,是因为以前在学分析的时候,写证明时很常使用到这样的概念来推理函数收敛、发散,亦或是推理的性质,而进了职场工作後,时常在做资料检查与分析的事,即便是使用这样简单的概念去推理资讯给交付者,也可以省下很多时间 (前提是对方要知道)。
在目前解决问题的系统中,你有一张 Orders
(订单) 表和 Installments
(分期) 表,表示一笔订单有多笔分期,分期资料会放在 Installemts
。
CREATE TABLE `orders` (
`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(256) NULL,
`createdAt` TIMESTAMP NOT NULL DEFAULT NOW(),
PRIMARY KEY (`id`));
CREATE TABLE `installments` (
`id` INT NOT NULL AUTO_INCREMENT,
`expectInstallAt` DATETIME NOT NULL,
`successfulInstallAt` DATETIME NULL,
`OrderId` INT NOT NULL,
PRIMARY KEY (`id`));
每一笔 Installemts
对应 Orders
是多 (笔分期) 对一 (个订单) 的关系,此时你已知 Installmets
是最大的集合,包含 Order
较小数量的集合。
现在,你的手上有一个 Order
的表以及分期的 Installment
(分期) 表,而你的主管正在怀疑某个订单 (order) 资料是否缺失,於是你现在检查了 Installments
任一笔资料是否 【找不到】 对应的 Orders
。
Installments 表:
Orders 表:
透过查询指令寻找两个表的资料是否有对上:
SELECT * FROM installments i
LEFT JOIN orders o ON o.id = i.OrderId
WHERE o.id IS NULL;
结果发现有一笔资料在 LEFT JOIN 之後真的没有 Orders (右侧被 JOIN 出来是 NULL):
此时,你可以很肯定无论怎样,这笔 Order Id 为 3 的资料已经缺失,找不到了,所以就算你到 Order 资料表中寻找或用其他方法 Join,也不会找到这笔资料。
这个就是 【2. 大的集合中不存在你需要的资料,那麽小的集合也不会有那笔资料】
现在,你收到了一笔资料,告诉你 InstallmentId 大集合与 OrderId 其中某一笔存在:
那也可以保证,Installments 这张表一定存在这笔 Order 的连结,这就是 【小的集合存在你需要的资料,那麽大的集合也会有那笔资料】,但反过来说,如果小的集合不存在你需要的资料,不代表大的集合不存在那笔资料。
换一题,你担心 2017 年某一张 Order 是否缺失所有 Installments 分期付款资讯,所以,检查 Installments (分期) 的目标是: 是否有任何一笔分期绑到这张指定的订单,所以你写了查询:
SELECT COUNT(*) FROM installments i WHERE i.OrderId = 3 AND YEAR(i.expectInstallAt) = 2017;
这个查询回传了结果:
虽然结果表示这笔订单是有 1 笔分期资料的,但是无法保证 installments 资料是完整的,这个就表示了,如果你有 2 笔资料,而你目前找到了一笔,就表示了【小的集合 (2017 年的集合) 存在你需要的资料,但不代表所有的集合都找得到另外一笔】。
这篇文章写的是集合使用的图表以及解释逻辑的部分,写起来颇难临时创造一个好的例子解释。
References:
[1] https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%9B%BE
>>: Day20,Grafana Loki 不一样的log选择
前言 Redis 是由义大利人Salvatore Sanfilippo所开发的Key-value资料...
tags: 2021铁人赛 React 既上一篇介绍完useState hook後,本篇就来介绍Da...
延续上一篇文章的例子,我们除了想要训练出 baseball player 之外,也希望他能够同时拥有...
breakpoint breakpoint操作符可以发送调试信号来暂停进程的运行(只要在给定的闭包中...
笔者一开始看到这两个词的时候充满着黑人问号??? 同步不是应该表示可以同时处理多件事, 而非同步不是...