函数依赖:
身份证号 姓名 年龄
例如 身份证号 可以 决定 姓名 年龄 就是2个函数依赖(身份证号--姓名,身份证号--年龄)
闭包:
上例中的姓名+年龄即身份证号的闭包
候选键:
身份证号 姓名 年龄 婚否
身份证号虽然可以决定姓名年龄 却不能决定婚否 所以身份证号不是候选键
身份证号+婚否 是一个候选键
候选键是一个最小集
主属性:
候选键中的所有成员都是主属性
第一范式:1NF
每一列的值不可再分
违反第一范式的解决方案:某列含2个属性,1、则将此行分为两行,分别存储2、一列分两列
第二范式:2NF
目的:消除不完全依赖
满足第一范式 并且每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
例:学生学号 课程号 学生成绩 课程学分
学号+课程号是候选键 但是课程号-->课程学分 课程学分不完全依赖于候选键 即不满足第二范式
不满足第二范式会导致:数据冗余,更新、插入、删除异常。
典然:学生信息与课程信息应该分离。
注意:候选键只有一个属性时 必然满足2NF(唯一标示每行的ID)
第三范式:3NF
目的:消除非主属性对候选健的传递依赖
传递依赖:X->Y->Z Y不能决定X Z不属于Y 则X->Z是传递依赖
满足第二范式,且每个非主属性都不传递依赖于候选键,则为第三范式。
例:学号,姓名,所在系,系名称和系地址
学号为候选键 是2NF 但是有大量冗余
学号->所在系->系地址 当这个依赖关系逆转时 发现 所在系无法决定学号 所以是传递依赖
显然:学生信息与 系的信息应该分离
BCNF:修正的3NF
目的:消除所有属性对候选键的传递依赖