数据库六种范式
一些基本概念
一些基本概念:
实体: 实体通常指代数据模型中的一个对象,常常对应数据库中的表
属性: 属性是关系数据库中的一个重要概念,对应于数据表中的列,描述了实体的特征或者特性
元组: 在关系数据库中,元组指的是数据表中的一行,包含了一组属性值
分量: 分量是元组中的某个具体的属性值
候选码和主码: 候选码是可以唯一确定一个元组的属性,主码是从候选码中选出的用来唯一标识一个元组的码
全码: 包含了所有属性的码,确保了其唯一性
主属性: 如果一个属性在任何一个候选码中出现过,那么它就是主属性,用来唯一标识一个元组
非主属性: 非主属性与主属性相反,没有在任何候选码中出现过,不能唯一标识一个元组
外码: 外码是一个属性(或者属性组),它不是本表的主码或者候选码,但是却可以关联到其他表的主码,用于建立表与表之间的关联。
关系模型的形式化定义
R(U,D,DOM,F)
R: 符号化的元组语义
U: 一组属性
D: 属性组U中的属性所来自的域
DOM: 属性到域的映射
F: 属性组U上的一组数据依赖
由于D,DOM与设计关系不大,因此这里把关系模式看作一个三元组R<U,F>
函数依赖
注: 因为电脑不太方便打出打杠的箭头,所以就用-->表示了
非平凡函数依赖:关系R(Sno,Cno,Grade),依赖关系(Sno,Cno)–>Grade是非平凡函数依赖
平凡函数依赖:关系R(Sno, Cno),依赖关系(Sno, Cno)→Sno,(Sno, Cno)→Cno都是平凡函数依赖
完全函数依赖:关系R(Sno,Cno,Grade),依赖关系(Sno,Cno)->Grade,但是Sno-->Grade且Cno-->Grade,因此这个依赖关系是完全函数依赖
部分函数依赖:关系R(Sno,Sname,Ssex,Sclass,Sage),依赖关系中我们可以用Sno,Sname推出Ssex,也就是(Sno,Sname)->Ssex,但是Sno->Ssex,这样的话就是部分函数依赖了。
传递函数依赖:图里面写的很明白,这里就不多赘述
函数依赖和属性的关系
设R(U)是属性集U上的关系模式,X、Y是U的子集。
如果X和Y之间是一对一(1:1)关系,如学校和校长,则存在函数依赖X→Y和Y→X。
如果X和Y之间是一对多(1:n)关系,如年龄和姓名,则存在函数依赖Y→X。
如果X和Y之间是多对多(m:n)关系,如学生和课程,则X和Y之间不存在函数依赖。
范式
第一范式 1NF
属性不可分
第二范式 2NF
第二范式要求一个表中的每个非主属性都完全函数依赖于候选码,即表中的每个非主属性都必须完全依赖于整个候选码,而不是部分依赖于候选码的某一部分。
我们来看这个表,很明显这个表不符合第二范式,其中STUD_NO
和COURSE_NO
是候选码(主属性),而COURSE_FEE
是非主属性,但是它并不依赖STUD_NO
,而是只依赖COURSE_NO
,因此是部分依赖于整个候选码。
由此可以得出,这个表不符合第二范式