集合推理与欧拉图

上一篇介绍了文氏图与 SQL 的集合的应用,这一篇要介绍的是欧拉图,欧拉图与文氏图不同之处,在於它主要不是用来显示交集关系的。

来看看下面两张图:

https://ithelp.ithome.com.tw/upload/images/20210920/20092753Wi5wLBsMCf.png

上图它呈现了三个集合之间有包含的关系,房子包含 A 房间包含手机,这之间都没有任何交集关系。

https://ithelp.ithome.com.tw/upload/images/20210920/20092753kqGgjmzguw.png

上图它呈现了一整个空间中有成功和非成功的分期付款资讯,主要要查询的部分有 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 较小数量的集合。

https://ithelp.ithome.com.tw/upload/images/20210920/20092753t1nH1Ufqtc.png

现在,你的手上有一个 Order 的表以及分期的 Installment (分期) 表,而你的主管正在怀疑某个订单 (order) 资料是否缺失,於是你现在检查了 Installments 任一笔资料是否 【找不到】 对应的 Orders

Installments 表:
https://ithelp.ithome.com.tw/upload/images/20210920/20092753XUwDS2FibQ.png

Orders 表:
https://ithelp.ithome.com.tw/upload/images/20210920/20092753WPcaiQVfmX.png

透过查询指令寻找两个表的资料是否有对上:

SELECT * FROM installments i
LEFT JOIN orders o ON o.id = i.OrderId
WHERE o.id IS NULL;

结果发现有一笔资料在 LEFT JOIN 之後真的没有 Orders (右侧被 JOIN 出来是 NULL):
https://ithelp.ithome.com.tw/upload/images/20210920/20092753zsj6iMw3Hn.png

此时,你可以很肯定无论怎样,这笔 Order Id 为 3 的资料已经缺失,找不到了,所以就算你到 Order 资料表中寻找或用其他方法 Join,也不会找到这笔资料。

这个就是 【2. 大的集合中不存在你需要的资料,那麽小的集合也不会有那笔资料】

确定性的资料存在

现在,你收到了一笔资料,告诉你 InstallmentId 大集合与 OrderId 其中某一笔存在:

https://ithelp.ithome.com.tw/upload/images/20210920/20092753rdmKsE8AWP.png

那也可以保证,Installments 这张表一定存在这笔 Order 的连结,这就是 【小的集合存在你需要的资料,那麽大的集合也会有那笔资料】,但反过来说,如果小的集合不存在你需要的资料,不代表大的集合不存在那笔资料。

资料完整性检查

换一题,你担心 2017 年某一张 Order 是否缺失所有 Installments 分期付款资讯,所以,检查 Installments (分期) 的目标是: 是否有任何一笔分期绑到这张指定的订单,所以你写了查询:

SELECT COUNT(*) FROM installments i WHERE i.OrderId = 3 AND YEAR(i.expectInstallAt) = 2017;

这个查询回传了结果:

https://ithelp.ithome.com.tw/upload/images/20210920/200927538xqcIPuo0b.png

虽然结果表示这笔订单是有 1 笔分期资料的,但是无法保证 installments 资料是完整的,这个就表示了,如果你有 2 笔资料,而你目前找到了一笔,就表示了【小的集合 (2017 年的集合) 存在你需要的资料,但不代表所有的集合都找得到另外一笔】。

这篇文章写的是集合使用的图表以及解释逻辑的部分,写起来颇难临时创造一个好的例子解释。

References:
[1] https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E5%9B%BE


<<:  AE-LED流动效果1-Day19

>>:  Day20,Grafana Loki 不一样的log选择

Day1 Redis环境准备

前言 Redis 是由义大利人Salvatore Sanfilippo所开发的Key-value资料...

用React刻自己的投资Dashboard Day9 - useEffect hook

tags: 2021铁人赛 React 既上一篇介绍完useState hook後,本篇就来介绍Da...

Abstract Factory 抽象工厂模式

延续上一篇文章的例子,我们除了想要训练出 baseball player 之外,也希望他能够同时拥有...

Day20 Combine 07 - Operators 其他常用操作符

breakpoint breakpoint操作符可以发送调试信号来暂停进程的运行(只要在给定的闭包中...

Day 05 JavaScript 同步(Sync) vs 非同步(Async)处理

笔者一开始看到这两个词的时候充满着黑人问号??? 同步不是应该表示可以同时处理多件事, 而非同步不是...