数据库之”范式“
范式(NF)
关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。各个范式之前的范围关系有5NF>4NF>BCNF>3NF>2NF>1NF
常见范式
1NF
每一个属性必须是不可分的数据项
2NF
满足1NF,并且每一个非主属性完全依赖任何一个候选码
3NF
满足2NF,并且每一个非主属性不传递依赖于码
函数依赖
简单地说 如果属性或者属性组X唯一确定性或者属性组Y,则称: Y函数依赖于X
完全函数依赖与部分函数依赖
举例:有关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)Sno:学生学号 |Sdep:学生专业| Sloc:学生住处|Cno:课程编号|Grade:成绩
有函数依赖(Sno,Cno)-> Sdep 这个函数依赖就是部分函数依赖
因为Sno ->Sdep 并且Sno是(Sno,Cno)的真子集
Sno ->Sdep这个函数依赖是一个完全函数依赖
码
候选码
设 K 为某表中的一个属性或属性组,若除 K 之外的所有属性都完全函数依赖于 K(这个“完全”不要漏了),那么我们称 K 为候选码,简称为码。在实际中我们通常可以理解为:假如当 K 确定的情况下,该表除 K 之外的所有属性的值也就随之确定,那么 K 就是码。一张表中可以有超过一个码。(实际应用中为了方便,通常选择其中的一个码作为主码) 例如:对于表3,(学号、课名)这个属性组就是码。该表中有且仅有这一个码。(假设所有课没有重名的情况)
参考https://blog.csdn.net/wenco1/article/details/88077279
超码
它是候选码的超集
所以它的定义和候选码的定义只差在 所有属性是完全依赖还是部分依赖
主码
当候选码有多个时候可以选择其中一个作为主码
主属性|非主属性|全码
主属性
包含在任何一个候选码中的属性称为主属性
非主属性
不包含在任何候选码中的属性称为非主属性
全码
最极端情况下,整个属性组是码,称为全码
主码和候选码有时都被简称为码
规范化
一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫”规范化“
规范化举例
场景
有关系模式S-L-C(Sno,Sdept,Sloc,Cno,Grade)Sno:学生学号 |Sdep:学生专业| Sloc:学生住处|Cno:课程编号|Grade:成绩 并且每个专业的学生住在同一个地方
分析
1、符合1NF
2、确定S-L-C的码为(Sno,Cno)
3、分析函数依赖
根据2NF定义:
满足1NF,并且每一个非主属性完全依赖任何一个候选码
本例子中非主属性Sdept,Sloc并不完全函数依赖于码(Sno,Cno)所以S-L-C不是2NF
不符合2NF导致的问题
插入异常:
想要插入数据 Sno=S7,Sdept=PHY,Sloc=BLD2 但是没有选课即没有Cno此时无法插入 因为插入元组时必须给定码值,这里缺少Cno所以整条记录无法插入。
删除异常
如果S4学生想要退选一门课C3 此时删掉这门课就意味着会删掉整条记录,如果此时S4学生只选过这门C3课也就意味着 S4的其他信息将彻底消失,造成删除异常。
修改复杂
如果某个学生从数学系转到计算机科学系,本来只需修改Sdept但是现在还得跟着修改Sloc,如果存在多个地方,则需要修改多次,造成修改复杂。
1NF->规范化->2NF
关系模式S-L-C规范化为关系模式SC和S-L
SC的码为(Sno,Cno)S-L的码为Sno。这样就使得非主属性对码都是完全函数依赖。
分析
关系模式SC没有传递依赖但是在S-L中 Sno->Sdept Sdept->Sloc
存在传递函数依赖所以不满足3NF规范
2NF->规范化->3NF
将S-L再分解为S-D(Sno,Sdept)D-L(Sdept,Sloc)
总结
1NF->消除非主属性对码的部分函数依赖->2NF
2NF->消除非主属性对码的传递函数依赖->3NF