《数据库原理》一二章读书笔记

使用数据库的原因

单纯的数据表格可以解决我们一般的数据记录需求,但是数据表格会有一些因为增、删、改造成的问题。例如:在一张学校信息表中,有一列记录了学生老师的Email,如果这个老师的Email修改了,我们需要花费很大精力去修改整张表。因此,关系模型的方法就随之诞生,成为了一项解决这些问题的新技术。

关系模型

关系是一种特殊类型的表(由行和列组成的二维表),这不和表格一样的吗?从目前信息的确如此,不过这种关系模型的关系必须具备一些特征,因此说关系是一种特殊类型的表。那么关系模型的特征有哪些呢?特征如下:

  • 行包含实体的数据
  • 列包含实体属性的数据
  • 表中的单元格存储单个值
  • 每列的所有实体类型一致
  • 每列具有唯一名称
  • 列的顺序任意
  • 行的顺序任意
  • 任意两行互不重复

所以,和单纯的数据表格不一样,有了这些特征的表格,就为关系表。有一种特殊的情况,就是在实际的应用中,我们的关系表中可能会存在重复的行,这时我们也默认该表也为关系表。

第一范式

在数据库设计的过程中,我们的数据库需要满足一些规范,根据不同的程度,要求满足不同的规则,这些规则称为范式,目前的关系型数据库一共有六种方式,对于关系模型的表,它就是满足了我们的第一范式。其它五种范式将在后续介绍,不过要满足后面的范式,必须先满足前面的范式。

表的一些术语

文件 记录 字段
关系 元组 属性

键的类型

键的定义:可以用来标识行的一列或多列。也就是说键可以唯一,也可以不唯一。

复合键

它包含多个属性(至少两个)的键称为复合键

候选键

唯一标识表中每一行的键,获选键可以使单列建,也可以是复合键

主键

主键的定义和候选键一样,但是在一个表中,只有一个主键(单列建或者复合键),这个主键就是从候选键中选举出来的

EMPLOYEE (EmployeeNumber, FirstName, LastName, Department, Email, Phone)

在这个表中,可以唯一标识每一行的键有:EmployeeNumberEmail和复合键(FirstName, LastName, Department),一般情况下,我们选择EmployeeNumber键作为主键,这样候选键和主键的概念大家就明白了。那么这个主键是怎么从候选键中选择出来的的呢?也就是选举的规则是怎样的呢?后面我们会提到

代理建

TEACHER (Name, Age, Sex)

在这张表中,我们很难选择一个键作为主键,那么此时在实际的操作中,我们会给这张表增加一个字段,来作为它的主键:

TEACHER (TeacherId, Name, Age, Sex)

那么这个我们增加的主键,就是代理建,它是主键,但是并不是这个实体的某一个属性,也不会有现实的使用情况。

外键

将一个表的值放入第二个表来表示关联,所使用的值是第一个表的主键值(在必要时可包括复合主键值)。此时,第二个表中保存这些值的属性称为外键(foreign key)。例如学生表中一般会存在一个TeacherId,这个TeacherId标识TEACHER表中的一个教师,那么在学生表中的这个TeacherId就是外键,当然,在学生表中这个字段的命名可以不和TeacherId一致,例如也可以是Teacher。如果一个表中存在外键,应该在相应的表中存在对应的主键,这个规则称为参照完整性约束

表的表示

表的表示

函数依赖

做一个表中,如果其中一个字段可以决定另一个字段的值,那么,我们就说某一个字段依赖于该字段。例如在学生表中,一个学生的身高决定了他穿衣服的大小,那么我就说衣服大小依赖于身高,或者身高决定衣服大小,用表达式表示:

Height → Size

对于两边的属性,可以是多个,如:

(Quantity, UnitPrice) → ExtendedPrice

一份订单的总结依赖于单价和数量,同样可以一对多和多对多,这里就不再举例了。

从候选键到主键

有了函数依赖的概念,我们就可以回答刚才怎么选举的问题了?表的主键可以定义为:该表中一个或多个可以通过函数决定其他所有属性的属性,那么候选键也如此,所以从候选键中选举主键是,我们要选择最有意义和最重要的函数依赖。

规范化

在我们创建完表后,可能这个表不是最优的,因为它可能存在一些问题,所以我们必须优化这个表,那么具体的步骤和规则是怎样的呢?这就不得不提到规范了:

  • 在结构良好的表中,每个决定因子都必须是候选键
  • 非结构良好的表应分解成两个或多个结构良好的表

规范化的过程

  • 找出所有候选键
  • 列出所有函数依赖
  • 检查函数依赖的决定因子,如果决定因子不是候选键则需要:a. 把函数依赖的列放在它自己的新表中。 b. 把函数依赖的决定因子作为新表的主键。 c. 将决定因子的副本作为原表中的外键。 d. 在新表和原表之间创建参照完整性约束
  • 重复第三步,直到所有的表都满足条件

规范化的示例

EMPLOYEE (EmployeeNumber, LastName, Email, Department, DeptPhone)

1.找出候选键

在这个表中,候选键为EmployeeNumberEmail

2.找出函数依赖

Department → DeptPhone

3.判断决定因子是否为候选键

Department并不是候选键,所以我们需要将函数依赖放入一个新的表中:

DEPARTMENT (Department, DeptPhone)

用决定因子Department作为主键,将主键放入前一个表作为外键:

EMPLOYEE (EmployeeNumber, LastName, Email, Department)

4.重复3步骤

决定因子都为候选键了,规范过程结束,最终表的设计:

EMPLOYEE (EmployeeNumber, LastName, Email, Department)

DEPARTMENT (Department, DeptPhone)

坚持原创分享,您的支持将鼓励我不断前行!