数据库范式
1 数据库范式
完全函数依赖
(Sno,Cno) —> Grade 是完全函数依赖,学号不能得出成绩,学科号也不能推出成绩。
部分函数依赖
(Sno,Cno) --> Sdept 是部分函数依赖,学号能推出院系。
传递依赖
Sno --> Sdept —> Sloc 学号推出院系 , 院系推出宿舍楼,但 Sloc --/–>Sdept, Sdetp --/–> Sno , 学号能推出 宿舍楼。
称之为传递依赖。
候选码
K为 R<U,F> (R表示一个域, U表示集合,F表示特定关系运算) 中的属性或者属性组合 若K --> U,则K是R的候选码。U完全函数依赖于K
举例:
学号,身份证号能推出学生的全部信息,学号,身份证号就成为 候选码,数据库主键就是从候选码中选择一个。
超码
K为 R<U,F> 中的属性或者属性组合, 若K —> U , 但 U 部分函数依赖于K ,k称之为超码。
(学号,年龄) —> student 则 (学号,年龄)就是超码。 带有候选码的集合就是超码
主属性
包含任意候选码中的属性称为主属性。如 候选码(Sno,Cno)Cno就是主属性
非主属性
不包含任何候选码成为非主属性。
1 第一范式
数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
2 第二范式
每一个非主属性完全函数依赖于任何一个候选码,称为第二范式。
(Sno,Cno) —> Ggrade ,所以 学号,学科号 是一个候选码,存在了非完全函数依赖,此时就不是第二范式。
不满足第二范式会出现 增,删异常,改复杂。
明确一点插入的记录,必须含有码。
插入学生时,学生还没选课,没有课程号,就不能插入,因为 学号,课程号 组成一个码。
应修改为两个表,此时满足第二范式。
3 第三范式
属于第二范式,不存在传递依赖,成为第三范式。
上面改造为
(Sno,Cno) – > Grade, Sno --> Sdept, Sdept --> Sloc。 三张表就满足第三范式。
4 BCNF
BC范式在 3NF 的基础上消除了主属性对候选键的部分依 赖或者传递依赖关系。
主属性仓库名对于候选码(管理员,物品名)存在非完全函数依赖。不满足BC范式。
修改为
仓库表 :(仓库名,管理员)
库存表 :(仓库名,物品名,数量)