《深入浅出SQL》问答录(六)

在这里插入图片描述

本系列出自《深入浅出MySQL》,全文以问答形式展开,是我的个人学习笔记。

问答录

先看花絮

Q:如果外键是NULL,它右什么作用吗?有办法确定外键已经连接到父键了吗?

A:外键为NULL,表示在父表中没有相符的主键。但我们可以确认外键包含有意义、已经存储在父表中的值,请通过约束实现。


Q:不能单纯的使用另一张表的键,称之为外键,而不加上约束吗?

A:其实可以,但创建成外键约束后,就只能插入已经存在于父表中的值,有助于加强两张表间的连接。


Q:加强连接?是什么意思?

A:外键约束能确保引用完整性(换句话说,如果表中的某行有外键,约束能确保该行通过外键与另一张表中的某一行一一对应)。如果我们试着删除主键表中的行或者是改变主键值,而这个主键是其他表的外键约束时,你就会收到错误警告。


Q:所以上面说的那种,我就不能删除了是吗?

A:还是可以的,先移除外键行即可。


Q:遇到多对多关系的时候,一定要用中间件吗?

A:不然呢?


花絮

数据库解析图

在这里插入图片描述
创建数据库的视觉解析图,在设计查询时有助于理解数据相连的方式,但模式也能以文字形式表达,看个人。

外键

在这里插入图片描述
在这里插入图片描述

外键约束

创建一张表并加上可作为外键的列虽然很简单,但除非你利用CREATE或ALTER语句来指定外键,否则都不算是真的外键。创建在结构内的外键被称为约束。

插入外键列的值必须已经存在与父表的来源中,这是引用完整性。

创建外键作为表的约束提供了明确的优势,如果违反了规则,约束会阻止我们破坏表。

外键不一定要是父表的主键,但是要具有唯一性。
在这里插入图片描述

设计数据库模式

数据模式:一对一

在模式图中,一对一关系的连接线是单纯的实线,表示连接一件事物与另一件事物。

在这里插入图片描述

使用一对一的时机

事实上,很少。

  1. 抽出数据或许能让你写出更快速的查询。
  2. 如果有列包含还不知道的值,可以单独存储这一列,以免主表中出现NULL。
  3. 我们可能希望某些数据不要太常被访问,隔离这些数据,即可管制访问次数。一员工表为例,他们的薪资信息最好另存一张表。
  4. 如果有一大块数据,例如BLOB类型,这段数据或许另存为另一张表会更好。

数据模式:一对多

A表的某一条记录可以对应到B表的多条记录,但B表中的一条记录只能对应A表中的某一条记录。
在这里插入图片描述
连接线应该带有黑色箭头来表示一对多的连接关系。

在这里插入图片描述

数据模式:多对多

在这里插入图片描述
司空见惯了,中介者模式(调停者模式)该上场了。

Junction table(连接表)

在这里插入图片描述

范式(NF)

第一范式(1NF)

  1. 数据列只包含具有院子性的值
  2. 没有重复的数据组
组合键

组合键就是有多个数据列构成的主键。

第二范式(2NF)

  1. 符合1NF
  2. 没有部分函数依赖性
函数依赖性

当某列的数据必须随着另一列的数据改变而改变时,表示第一列函数依赖与第二列。

部分函数依赖:非主键的列依赖与组合键的某个部分(但不是完全依赖与组合主键)。

传递函数依赖:如果改变任何非键列可能造成其他列的改变,即为传递依赖。

第三范式(3NF)

  1. 符合2NF
  2. 没有传递函数依赖性

猜你喜欢

转载自blog.csdn.net/qq_43762191/article/details/107521373