写给自己复习的..
第一范式
所谓第一范式就是不允许出现重复组. 所谓重复组就是一列中有多个数据.. 第一范式是关系数据库的标志, 如果第一范式不满足, 就不是关系数据库表.
1. 避免重复列.
例如:
学生 科目
Jason 语文, 数学
Peter 英语
我们应该增加一个数据行确保列种每个值都是单一值.
学生 科目
Jason 语文
Jason 数学
Peter 英语
第二范式
第二范式有点难度了:
1. 第二范式的前提是符合第一范式
2. 表中每个数据行都可以必须唯一标识(primary key).
3. 数据表中的所有非主键列必须完全依赖于主键
1, 2点都很容易理解.
关键是怎么理解那个完全依赖于了.
下面举例:
学生 科目 总课时 考试得分
Jason 语文 80 67
Jason 英语 70 82
Hebe 语文 80 80
Peter 英语 70 91
上面那个表数据很常见吧, 可以看出上面的表的primary key 是1个组合键(学生,科目)
而考试得分这个列是完全依赖于这个组合键的. 即是单单凭学生或者单单凭科目是决定不了考试得分的值的.
但是总课时至于组合键中的科目有关, 与学生并没有依赖关系, 所以不是完全依赖于主键, 只是依赖于主键中的1个列.
所以上面那张表不符合第二范式.]
如果要让它符合第二范式, 可以把 总课时这个列移除到另1个表中.
学生 科目 考试得分
Jason 语文 67
Jason 英语 82
Hebe 语文 80
Peter 英语 91
科目, 总课时
语文 80
英语 70
那么上面的两张表就符合第二范式了.
第三范式
其实第三范式相对来讲更加容易理解.1. 第三范式必须符合第二范式
2. 所有非主键的属性之间没有依赖关系.
举例:
产品id 价格 制造商 制造商地址
1 300 A addr_a
2 280 B addr_b
上面的表主键是产品id. 非主键的价格 和 制造商没有依赖关系, 但是制造商地址依赖于制造商...
所以一旦制造商地址改变, 往往导致要修改数据库中多个数据行.
就不符合第三范式了.
解决方法就如上面第二范式的例子, 把 制造商和其地址的对应关系放到另1张表中.
Boyce-Codd 范式
所谓的BC范式, 其实是第三范式的一个子集.
第三范式规定所有非主键属性都不能依赖于其中之一的非主键属性
BC范式更加严格, 所有属性都不能依赖于其中之一的非主键属性.
依旧是说, BC范式中的主键不能依赖于任何非主键.
例子:
国家(key) 缩写 人口 区域
日本 JPN 1亿 亚洲
英国 ENG 半亿 欧洲
上面例子中的主键国家能决定缩写, 但是缩写也能决定国家, 所以国家和缩写之间是互相依赖的, 主键依赖于了非主键, 它符合第三范式
但是不符合BC范式...