数据库规范化范式设计
简介
这里整理数据存储设计的几个套路。
1 关系数据库规范化
函数依赖:
定义:设R(U)是属性U的关系模式,X,Y是U的子集,
对于R(U)的任意一个可能的关系r,r的任意两个元组在X上属性值相等,
那么在Y上的属性值也相等,称“X函数确定Y” 或Y函数依赖X,记为 X->Y.
X称为这个函数依赖的决定属性组,也称为决定因素。
例如:关系式S(Sno,Sname,Ssex,Sage,Sdept)
F={Sno->Sname,Sno->Ssex,Sno->Sage,Sno->Sdept}
若Y没有函数依赖于X,则记为X !->Y.
例如: Ssex !-> Sage, Ssex !-> Sdept
X -> Y, Y 不属于 X,则称 X -> Y 是 非平凡的 函数依赖
X -> Y, 但 Y 属于 X, 则称 X -> Y 是 平凡的 函数依赖
平凡函数依赖
- 超键
属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。
例如学生关系模式的 学号,身份证,学号-姓名,身份证号,性别等。
- 候选键
不含多余属性,这些超键被称为 候选键,是超键的最小子集。 如 学号,身份证
- 主键
用户挑选的做元组标识的一个候选键称为主键。
如,我们通常选择学号作为主键
- 外键
如果关系模式R中的某些属性集不是R的主键,而是关系模式S的主键,这个属性集对模式R而言是外键。
例如,教师编号,是这个学生关系模式的外键
- 主属性
包括在任何一个候选键中的属性称为主属性,否则称为非主属性。
- Armstrong公理
Armstrong公理:从已知的一些函数依赖,可以推导出另外一些函数依赖,
这就需要一系列推理规则,这些规则常被称作“Armstrong 公理”.
设关系式R(U,F),U是关系模式R的属性集,F是U上一组函数依赖,则有以下
三条推理规则:
1) A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;
2) A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
3) A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。
根据上面三条推理规则,又可推出下面三条推理规则:
4) 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;
5) 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;
6) 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。
例子:
例如有两个关系模式:
1 学生(学号、姓名、性别、身份证号、教师编号)
2 教师(教师编号、姓名、工资)
数据库范式中判定设计属于哪一个类型,通常需要使用Armstrong公理传递性依赖是否存在,做为依据。
1.1 非平凡函数依赖
例如 关系式 Student Sno(学号),Sdept,Mname,Cno(课程号),Grade
名称 定义
完全函数依赖 Sno,Cno -> Grade 是完全函数依赖,
必须要两个条件都知道才能确定Grade
部分函数依赖 (Sno,Cno) -> Sdept 是部分函数依赖
只需要知道一个条件,就可以确定 Sdept
传递依赖 Sno->Sdept,Sdept->Mname,则称Mname传递依赖于Sno
通过Sno 学号,可以间接查询出 Mname
2 数据库范式
共有 5个范式,也就是 1NF~5NF
1NF 范式
若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式。
2NF 范式
若关系模式 R 属于 1NF,且每一个非主属性完全依赖主键时,则关系式 R 是 2NF
例如 R 学号,姓名,班级,课程,成绩
函数依赖:
学号 -> 姓名,学号 -> 班级,(学号,课程号)->成绩
主键: 学号,课程号
姓名,班级部分依赖于 主键,不属于2NF,需要将其分解为
R1 学号,姓名,班级
R2 学号,课程,成绩
3NF 范式
当2NF消除了非主属性对主键的传递函数依赖,则称为3NF
也就说,全部非主属性都直接依赖于主键。
SNo Sname Dno Dname
3001 张军 D01 计算机
3002 李明 D01 计算机
4003 王丽 D01 计算机
0004 李红 D02 自动化
0001 刘强 D02 自动化
SNo Sname Dno
3001 张军 D01
3002 李明 D01
4003 王丽 D01
0004 李红 D02
0001 刘强 D02
Dno Dname
D01 计算机
D01 计算机
D01 计算机
D02 自动化
D02 自动化
3 小结
实际工作中,规范化的应用不如反规范化普遍,为了优化数据库常用的反规范化方法如:
增加几余列:是指在多个表中具有相同的列,它常用来在查询时避免连接操作。
增加派生列:指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。
重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。
水平分表:按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大、表中数据相对独立或数据需要存放到多个介质上时使用。
垂直分表:对表进行分割,将主键与部分列放到一个表中,主键与其它列放到另一个表中,在查询时减少 1/0 次数
- 点赞
- 收藏
- 关注作者
评论(0)