数据库原理与应用 第 13 章 · 上机四
课程第 13 章上机四 摆回来同主码搬过去少一张横着切连回来切错了走一遍 版式
第 13 章 数据库概念结构设计和逻辑结构设计 · 上机四

合并与分解,一行都不能少

课件第 32、33 页那两步改进,合并三张、水平切一张,再故意切错一次。
已完成 0 / 7
本 次 上 机 题 目
  1. 01把上一次上机建好的表摆回来
  2. 02拥有和地址,主码是同一个
  3. 03把用户编号搬进地址表
  4. 04空壳删掉,订单也照这样带上地址编号
  5. 05包含表按季度切成两张
  6. 06两张再拼回去,一行都不能少
  7. 07竖着切错地方,连回来多两行
  8. 合并加分解,从头跑到尾
01
第 13 章 · 上机四

把上一次上机建好的表摆回来

这一页要合并和分解,先把要用到的六张表原样建好装好。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

小王有两个收件地址,阿华有一个,一共三行。

知道更多

这里只留了合并和分解要用的字段,别的先省掉。

02
第 13 章 · 上机四

拥有和地址,主码是同一个

合并的条件就这一条,两张表主码一样。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

两张都是三行,主码都是地址编号,这就能合。

分清楚能不能合

联系结论
1:1能合
1:n能合
m:n不能合

想一想

为什么 m:n 那张合不进去?

03
第 13 章 · 上机四

把用户编号搬进地址表

地址加一列,值从拥有那张表里取,取完核对一遍。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

改了 3 行,一个 NULL 都没剩,说明一条都没漏。

知道更多

合并前后行数没变,因为主码一样,本来就是一一对上的。

想一想

要是有个地址在拥有表里查不到,会怎样?

04
第 13 章 · 上机四

空壳删掉,订单也照这样带上地址编号

合并掉一个 1:n 联系就少一张表,全局图上三个都这么办。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

拥有没了,用户编号还在。三个 1:n 都合掉,13 张就变 10 张。

知道更多

第 27 页那句 1:n 并不产生新关系,说的就是合并之后的结果。

想一想

先建再合并这一步能不能跳过?

05
第 13 章 · 上机四

包含表按季度切成两张

数据量大了就按固定周期分开存,行整行地搬。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

两张表结构一模一样,切的是行,不是列。

关键术语两种切法

水平分解horizontal
结构不变,把行分到几张表
垂直分解vertical
行不变,把列分到几张表
06
第 13 章 · 上机四

两张再拼回去,一行都不能少

水平分解连回来用 UNION ALL,不是自然连接。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

2 加 1 等于 3,跟原表一样,水平分解天生无损。

想一想

换成 UNION 不加 ALL,行数会变吗?

07
第 13 章 · 上机四

竖着切错地方,连回来多两行

同一张包含表,按列切开,切在没有主码的地方。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

连回来 5 行,原表只有 3 行,多出来那两行是编的。

知道更多

两边都留着主码的一部分才连得回来,这是第 12 章讲过的。

想一想

怎么切才不会多出行来?

第 13 章 · 上机四

合并加分解,从头跑到尾

头一句先删干净,六张表建好,合三张、切两张、连回来。

Welcome to the MySQL monitor. Commands end with ;
Server version: 8.0.36 MySQL Community Server - GPL
终端一打开是一个空的 design 库,这一章的表全部由你自己按 E-R 图建出来。
mysql>

重 点

合并少一张表,分解多一张表,数据一行没多一行没少。

记牢它改模式

  1. 主码相同就合
  2. 数据太多就切
  3. 切完要连得回来

想一想

整章走下来,纸上画的那张图落到了哪一步?

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