数据库三大范式
函数依赖
设R(U)是属性集U上的关系式,X,Y是U的子集。
若对于 R(U) 的任意一个可能的关系 r,r中不可能存在两个元组在 X 上的属性值相等,而在 Y 的属性值上不等。
则称 X 函数确定 Y , 或 Y 函数依赖于 X ,记作 :
$$
X \rightarrow Y
$$
平凡函数依赖
$$
X \rightarrow Y , Y \subseteq X
$$
即Y函数依赖于X,并且Y含于X。
非平凡函数依赖
$$
X \rightarrow Y , Y \not\subseteq X
$$
即Y函数依赖于X,但是Y不含于X。
完全函数依赖
在R(U)中,如果
$$
X \rightarrow Y ,且对于X的任何一个真子集X’,都有X’ \not\rightarrow Y
$$
则称Y对于X完全函数依赖,记作:
$$
X \xrightarrow F Y
$$
部分函数依赖
在R(U)中,如果
$$
X \rightarrow Y ,但是Y不完全函数依赖于X
$$
则称Y对X的部分函数依赖。
码
候选码
设K为R<U,F>中的属性或属性组合,U完全函数依赖于K,即
$$
K \xrightarrow F U
$$
则K为R的候选码。
超码
如果U函数依赖于K,即
$$
K \rightarrow U
$$
则称K为R的超码。
主码
若候选码有多个,选定一个为主码。
主属性
包含在任何一个候选码中的属性称为主属性。
不包含在任何候选码中的属性为非主属性
。
第一范式
认为数据库表中的字段不可以再进行分解。
这个需要根据具体情况具体分析,有些情况下可以认为字段可以拆分,有些情况下认为字段不可以拆分。
第二范式
满足第一范式的要求,并且数据库表中每一个非主属性完全函数依赖
于任何一个候选码。
第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关。
候选码对应的属性组的任何真子集都不能构成候选码。
不满足第二范式可能会出现:插入异常、删除异常和修改异常。
例如表: 学号、课程号、姓名、学分 就不符合第二范式,因为学分依赖于学号和课程号,但是姓名只依赖于学号。
第三范式
关系模式满足第一范式要求,若R中不存在这样的码X,
$$
属性组Y及非主属性Z ,满足 Z \not\subseteq Y
$$
使得
$$
X \rightarrow Y, Y \rightarrow Z (Y \not\rightarrow X)
$$
成立,则称R满足第三范式。
即,若R满足第三范式,则每一个非主属性既不传递依赖于码,也不部分依赖于码。
第三范式确保了每列都和主键列直接相关,而不是间接相关。
不满足第三范式可能会出现数据冗余和更新异常。
例如表: 学号, 姓名, 年龄, 学院名称, 学院电话 不符合第三范式,因为存在传递依赖
学号→学生→学院。
参考资料:
https://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html
https://www.huaweicloud.com/articles/c1c4f2d4c72b61eab44114ae8286835f.html
数据库系统概论(第5版)高等教育出版社