基本概念:函数依赖、完全函数依赖、部分函数依赖、传递依赖、Armstrong公里;超键、候选键、主键、外键、主属性和非主属性。
基础概念
函数依赖
属性A–>属性B,例如“身份证号码–>姓名"
完全函数依赖
属性集A(学号,课程号)->成绩,其中属性集A 的任意真子集都无法推出成绩。
部分函数依赖
与完全函数依赖相反。属性集A(学号,课程号)->姓名,其中 学号->姓名。此时姓名 部分函数依赖 属性集A。
传递依赖
X->Y,Y->z 则 X->z
Armstrong公理
设关系式R(U,F)是关系模式R的属性集,F是U上一组函数依赖,则有以下三条推理规则:
- A1自反律
若Y 包含于 X 包含于 U,则X->Y为F所蕴含 - A2增广律
- A3传递律
根据以上3条推理规则又可推出以下3条推理规则 - 合并规则
- 伪传递率
- 分解规则
超键
在关系中能唯一标识元组的属性集称为关系模式的超键。
候选键
不含有多余属性的超键为候选键。
主键
用户选择元祖标识的一个候选键称为主键,
外键
如果关系模式R中的某些属性集不是R的候选键,而是关系模式S的候选键,则这个属性集对模式R而言是外键。
主属性和非主属性
候选键所包含的属性就是主属性,否则称为非主属性。
无损连接
关系A 分解为 关系1、关系2 … 后,通过关系1、2、3…可以得到关系A。
范式
数据库满足第几范式,用来评价关系数据库的规范化程度。将低一级范式的关系模式分解转换成高一级范式,这个过程就是规范化。
第一范式(1NF)
定义: 属于第一范式关系的所有属性都不可再分,即数据项不可分。
理解: 第一范式强调数据表的原子性,是其他范式的基础。如下图所示数据库就不符合第一范式:
上表将商品这一数据项又划分为名称、数量两个数据项,故不符合第一范式关系。改正之后如下图所示:
上表就是符合第一范式关系。
规范化: 一个低一级的关系模式通过分解可以转化为若干个高一级范式的关系模式的集合,这个过程叫做规范化。
第二范式(2NF)
定义: 若某关系R属于第一范式,且每一个非主流属性完全依赖于任何一个候选码,则关系R属于第二范式。
** 候选码:** 若关系中的某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码。若一个关系中有多个候选码,则选定其中一个为主码。
理解: 第二范式是指 非主属性完全依赖主键。
判断一个关系是否属于2NF:
- 找出 所有的码
- 找出所有主属性、非主属性
- 判断非主属性是否存在对主属性的部分函数依赖。
第三范式(3NF)
定义: 非主属性即不传递依赖于码,也不部分依赖于码。
理解: 第三范式要求在满足第二范式的基础上,任何非主属性不依赖于其他非主属性,即在第二范式的基础上消除了传递依赖。
BC范式(BCNF)
定义: 关系模式R<U,F>中,若每一个决定因素都包含码,则R<U,F>属于BC范式。
理解: 满足BC范式的关系模式有:
- 所有非主属性对每一个码都是完全函数依赖
- 所有主属性对每一个不包含它的码也是完全函数依赖;
- 没有任何属性完全函数依赖于非码的任何一组属性。
反规范化
规范化减少了数据冗余,节约了存储空间,相应逻辑和物理I/O次数减少,同时加快了增删改的速度,但由于连接操作影响了查询速度。
增加冗余列
可以通过连接查询获得的数据。
学生成绩表中只需要(学号、课程号、成绩),而页面展示是(学号、姓名、课程号、课程名称、成绩)。
这时候可以在 表中 增加 冗余列:姓名、课程名称。
增加派生列
通过表中其他数据计算生成。
进货表(商品单价、商品数量),可以增加 总价 属性。
重新组表
如果许多用户需要查看两个表连接出来的结果数据,则把这两个表组成一个表减少连接提升性能。
分割表
表分科有两种方式:水平、垂直。
水平分割
根据一列或多列数据的值把数据行放到两个或多个独立的表中。适用情况:
- 表很大,分割后可以降低在查询时需要读的数据和索引页数。同时降低索引层数,提升查询效率。
- 表中数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
- 需要把数据存放到多个介质上。
垂直分割
把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中某些列常用,而另外一些列不常用,则可以采用垂直分割,另外垂直分割可以使得数据行变小,一个数据页就能存放更多数据,在查询时就会减少IO次数,缺点是需要管理冗余列,查询所有数据需要连接操作。
案例:
文章(ID、标题、作者、简介、正文),可以分解为 文章(ID标题、作者、简介),文章正文(ID、正文)