第一范式:列不可分。每一列都是不可分割的基本数据项。
第二范式:在第一范式的基础上,对于多关键字表,非主属性不能部分依赖于主键(比如只依赖某个主键);对于单关键字表,不存在部分依赖情况,不符合2NF的设计容易产生数据冗余。
比如一张表是(A, B, C, D),其中(A, B)是主键,如果存在B->C就违反了2NF,因为C只需要主键的一部分就可以被决定了
a.反例:
StudyNo
Name
Sex
Phone
ClassNo
ClassAddress
20040901
john
Male
Email:kkkk@ee.net
222456
200401
#12A
20040902
mary
famale
email:kkk@fff.net
123455
200402
#8A
主键是studyNo和classNo。classAddress部分依赖主键classNo,需要变为两个表。
b.正解:
学生表
StudyNo
Name
Sex
Phone
20040901
john
Male
Email:kkkk@ee.net
222456
20040902
mary
famale
email:kkk@fff.net
123455
教室表
ClassNo
ClassAddress
200401
#12A
200402
#8A
第三范式:在第二范式的基础上,非关键字段对任一主键不能传递函数依赖。非主键列之间不能存在依赖关系,必须直接依赖主键,不能传递依赖。即不能存在:非主键列A依赖于非主键列B,B依赖于主键的情况。
a.反例:
StudyNo
Name
Sex
Phone
BounsLevel
Bouns
20040901
john
Male
Email:kkkk@ee.net
222456
优秀
¥1200
20040902
mary
famale
email:kkk@fff.net
123455
良
¥800
主键是StudyNo,只有一个主键StudyNo,而且符合第二范式。但是非主键列bounsLevel和bouns存在依赖关系。
b.正解:
学生表
StudyNo
Name
Sex
Phone
BounsNo
20040901
john
Male
Email:kkkk@ee.net
222456
1
20040902
mary
famale
email:kkk@fff.net
123455
2
奖学金等级表
BounsNo
BounsLevel
Bouns
1
优秀
¥1200
2
良
¥800
BCNF(Boyce-Codd):在第三范式的基础上,不允许出现主键的一部分被另一部分或其他决定。即不存在关键字段决定关键字段的情况。
a. 反例:StoreHouseManager
StoreHouseID(仓库ID)
GoodsID(商品ID)
ManagerID(管理员ID)
GoodsNum(商品数量)
001
20130104
1
200
主键是
(仓库ID, 商品ID) →(管理员ID, 数量) 或
(管理员ID, 商品ID) → (仓库ID, 数量),
(仓库ID, 商品ID)和(管理员ID,商品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量
满足第三范式。但是,存在关键字段决定关键字段情况。
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
b. 正解:
仓库管理表
StoreHouseID(仓库ID)
GoodsID(商品ID)
GoodsNum(商品数量)
001
20130104
200
仓库表
StoreHouseID(仓库ID)
ManagerID(管理员ID)
001
1