使用数据库的原因
单纯的数据表格可以解决我们一般的数据记录需求,但是数据表格会有一些因为增、删、改造成的问题。例如:在一张学校信息表中,有一列记录了学生老师的Email,如果这个老师的Email修改了,我们需要花费很大精力去修改整张表。因此,关系模型的方法就随之诞生,成为了一项解决这些问题的新技术。
关系模型
关系是一种特殊类型的表(由行和列组成的二维表),这不和表格一样的吗?从目前信息的确如此,不过这种关系模型的关系必须具备一些特征,因此说关系是一种特殊类型的表。那么关系模型的特征有哪些呢?特征如下:
- 行包含实体的数据
- 列包含实体属性的数据
- 表中的单元格存储单个值
- 每列的所有实体类型一致
- 每列具有唯一名称
- 列的顺序任意
- 行的顺序任意
- 任意两行互不重复
所以,和单纯的数据表格不一样,有了这些特征的表格,就为关系表。有一种特殊的情况,就是在实际的应用中,我们的关系表中可能会存在重复的行,这时我们也默认该表也为关系表。
第一范式
在数据库设计的过程中,我们的数据库需要满足一些规范,根据不同的程度,要求满足不同的规则,这些规则称为范式,目前的关系型数据库一共有六种方式,对于关系模型的表,它就是满足了我们的第一范式。其它五种范式将在后续介绍,不过要满足后面的范式,必须先满足前面的范式。
表的一些术语
表 | 行 | 列 |
---|---|---|
文件 | 记录 | 字段 |
关系 | 元组 | 属性 |
键的类型
键的定义:可以用来标识行的一列或多列
。也就是说键可以唯一,也可以不唯一。
复合键
它包含多个属性(至少两个)的键称为复合键
候选键
唯一标识表中每一行的键,获选键可以使单列建,也可以是复合键
主键
主键的定义和候选键一样,但是在一个表中,只有一个主键(单列建或者复合键),这个主键就是从候选键中选举
出来的
EMPLOYEE (EmployeeNumber, FirstName, LastName, Department, Email, Phone)
在这个表中,可以唯一标识每一行的键有:EmployeeNumber
、Email
和复合键(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.找出候选键
在这个表中,候选键为EmployeeNumber
和Email
2.找出函数依赖
Department → DeptPhone
3.判断决定因子是否为候选键
Department并不是候选键,所以我们需要将函数依赖放入一个新的表中:
DEPARTMENT (Department, DeptPhone)
用决定因子Department
作为主键,将主键放入前一个表作为外键:
EMPLOYEE (EmployeeNumber, LastName, Email, Department)
4.重复3步骤
决定因子都为候选键了,规范过程结束,最终表的设计:
EMPLOYEE (EmployeeNumber, LastName, Email, Department)
DEPARTMENT (Department, DeptPhone)