第一范式:列不可分。每一列都是不可分割的基本数据项。
第二范式:在第一范式的基础上,对于多关键字表,非主属性不能部分依赖于主键(比如只依赖某个主键);对于单关键字表,不存在部分依赖情况,不符合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 |