# 范式
设计关系数据库时,需要满足不同的规范,这些规范称为范式。范式的目的是为了消除数据冗余以及操作异常,使数据库结构清晰、简洁明了。
# 候选码
候选码是一个或多个属性,它能够完全决定整个属性组。
# 主码
如果一个属性组有多个候选码,可从中选取一个做为主码。
# 主属性
包含在任何一个候选码中的属性,称为主属性。
# 非主属性
不包含在任何一个候选码中的属性称为非主属性。
# 多值依赖
假设X, Y, Z是U的子集,并且 Z=U - X - Y。如果在X上取特定值,在Y上存在多个值且这些值与Z无关,则称Y多值依赖于X,记为 X →→ Y。
若 X→→Y, 且Z为空集,则称 X→→Y 为平凡的多值依赖;
若 Z 不为空,则称 X→→Y 为非平凡的多值依赖;
# 函数依赖和多值依赖
函数依赖是多值依赖的特殊情况;
函数依赖是唯一确定的关系,例如课程号唯一确定课程名称;
多值依赖却不能唯一确定,例如教师号可能多值依赖于课程号,因为多个老师可以上同一门课;
# 第一范式(1NF)
1NF是指数据库表中的每一列都是不可分割的原子数据项,简而言之就是不能表中有表。
# 第二范式(2NF)
2NF是指在1NF的基础上,消除非主属性对码的部分依赖(非主属性必须完全依赖于码)。
例如:(学号, 课程号, 分数, 姓名)就不是2NF,因为姓名只是部分依赖于(学号,课程号)。
# (学号, 课程号)是码
# 第三范式(3NF)
3NF是指在2NF的基础上,消除非主属性对码的传递依赖(非主属性不能依赖于其他非主属性)。
例如:(学号, 姓名, 学院编号, 学院名称)就不是3NF,因为有学号 -> 学院编号 -> 学院名称。
# (学号)是码
# BCNF
BCNF是指在3NF的基础上,要求每一个决定属性因素都必须包含码(主属性不能部分依赖于其它不包含它的码)。
例如:(学号, 教师号, 课程号)就不是BCNF,因为有教师号 -> 课程号,但教师号不是码。
# (学号, 教师号)和(学号, 课程号)都是码
# 第四范式(4NF)
4NF是指在3NF的基础上,消除非平凡且非函数依赖的多值依赖(每个非平凡多值依赖X→→Y(Y不属于X),X都含有码)。
例如:(课程名, 教师名, 参考书名)就不是4NF,因为 课程名 →→ 教师名,而课程名不是码。
# (课程名, 教师名, 参考书名)是码
# 第五范式(5NF)(极少用到,这里不做介绍了)
5NF是指在4NF的基础上,消除不是由候选码所蕴含的连接依赖。
# 规范化的步骤
# url
http://idc.hust.edu.cn/~rxli/teaching/dbs/