数据库六种范式

一些基本概念

一些基本概念:
实体: 实体通常指代数据模型中的一个对象,常常对应数据库中的表

属性: 属性是关系数据库中的一个重要概念,对应于数据表中的列,描述了实体的特征或者特性

元组: 在关系数据库中,元组指的是数据表中的一行,包含了一组属性值

分量: 分量是元组中的某个具体的属性值

候选码和主码: 候选码是可以唯一确定一个元组的属性,主码是从候选码中选出的用来唯一标识一个元组的码

全码: 包含了所有属性的码,确保了其唯一性

主属性: 如果一个属性在任何一个候选码中出现过,那么它就是主属性,用来唯一标识一个元组

非主属性: 非主属性与主属性相反,没有在任何候选码中出现过,不能唯一标识一个元组

外码: 外码是一个属性(或者属性组),它不是本表的主码或者候选码,但是却可以关联到其他表的主码,用于建立表与表之间的关联。

关系模型的形式化定义

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,因此这个依赖关系是完全函数依赖

(Sno,Cno)FGrade(Sno,Cno) \overset{F}{\longrightarrow} 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

https://www.geeksforgeeks.org/second-normal-form-2nf/

第二范式要求一个表中的每个非主属性都完全函数依赖于候选码,即表中的每个非主属性都必须完全依赖于整个候选码,而不是部分依赖于候选码的某一部分。

我们来看这个表,很明显这个表不符合第二范式,其中STUD_NOCOURSE_NO是候选码(主属性),而COURSE_FEE是非主属性,但是它并不依赖STUD_NO,而是只依赖COURSE_NO,因此是部分依赖于整个候选码。

由此可以得出,这个表不符合第二范式

第三范式 3NF

BCNF