数据库原理与应用 第 12 章 · 上机三
课程第 12 章上机三 第一步灌数据第二步连回来对一对切错了多出两行毛病没了连起来 版式
第 12 章 关系模式的规范化理论 · 上机三

两步分解,再连回来

照着课件那两张分解图,把 SCD 真的拆成三张表,再自然连接连回来数行数。
已完成 0 / 8
本 次 上 机 题 目
  1. 01消部分依赖,拆成 SC 和 SD
  2. 02投影分解就是一句 SELECT DISTINCT
  3. 03消传递依赖,SD 再拆成 S 和 D
  4. 04自然连接把三张表拼回原样
  5. 05逐行核对,一行不多一行不少
  6. 06同一张 SD,换个地方切开
  7. 07连回来变成六行
  8. 08拆对之后,三种异常各试一次
  9. 从头走一遍,再验一次无损
01
第 12 章 · 上机三

消部分依赖,拆成 SC 和 SD

只依赖 SNo 的那几列单独成表,剩下的留给选课。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

SC 的主码还是两列,SD 的主码只剩 SNo 一列,部分依赖就没处躲了。

想一想

为什么 SD 的主码只用一列就够?

02
第 12 章 · 上机三

投影分解就是一句 SELECT DISTINCT

从原表里各取几列去重,就是分解出来的那张表。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

SC 装了 10 行,SD 只有 4 行,学生信息一下少抄了六遍。

知道更多

分解在关系代数里叫投影,写成 SQL 就是 SELECT DISTINCT 那几列。

03
第 12 章 · 上机三

消传递依赖,SD 再拆成 S 和 D

SNo → Dept → MN 这条链,从 Dept 处切开。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

系表只有 3 行,一个系一行,主任的名字全库只存这一份。

上机做

上机一第 4 题 回去看改漏那一题

04
第 12 章 · 上机三

自然连接把三张表拼回原样

同名列自己配对,不用写 ON 条件。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

10 行,和原表一行不差,这就是教材说的无损连接。

关键术语记住这个名字

无损连接lossless join
连回来与分解前信息量相同

想一想

为什么连出来第一列变成了 Dept?

05
第 12 章 · 上机三

逐行核对,一行不多一行不少

先数原表,再数连回来的,两个数字要一样。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

中间那句 Empty set,说明选课表里没有哪个学号在学生表里找不到。

知道更多

真要建库时这一句就该写成外码,让数据库自己拦。

06
第 12 章 · 上机三

同一张 SD,换个地方切开

把年龄跟着系别走,看连回来还是不是四行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

SD2 里信息系出现了两行,因为钱尔 18 岁孙珊 20 岁。

想一想

年龄跟着系别走,合理吗?

07
第 12 章 · 上机三

连回来变成六行

原来四行,连回来六行,多出来的那两行是编的。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

钱尔多了一条 20 岁,孙珊多了一条 18 岁,这叫有损分解。

记牢它分解要看两件事

  1. 连回来行数一样
  2. 函数依赖一条不少

想一想

多出来的两行为什么分不出真假?

08
第 12 章 · 上机三

拆对之后,三种异常各试一次

新系插得进,删学生系还在,改主任只动一行。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

插入进去了,自动化系还在,改主任只动 1 行,三个毛病一起没了。

上机做

上机一第 3 题 对比没拆的时候

想一想

代价是什么?

第 12 章 · 上机三

从头走一遍,再验一次无损

头一句先把刚才那几张表全删掉,再从零走一遍。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开,课件第 5 页那张 SCD 表就已经建好装好,当前库是 norm。
mysql>

重 点

三条 CREATE 加三条 INSERT,一张烂表就变成了三张 3NF 的表。

知道更多

DROP TABLE IF EXISTS 后面可以跟好几个表名,不存在的也不报错。

想一想

这三张表分别在讲哪一件事?

保山学院·人工智能教研室·曹鼎鼎