关系数据库规范化:关系内部各属性之间的联系的合理化程度-----范式
1NF:
- 每个属性都不可再分;
- 1NF是所有关系型数据库的最基本要求.;
- 但是仅仅符合1NF的设计,仍然会存在数据冗余过大。
2NF:
2NF在1NF的基础之上,消除了非主属性对于码的 部分函数依赖。函数依赖:
属性X能够确定属性Y,则Y函数依赖于X,即X->Y(依赖于谁,谁在前面)。
- 完全函数依赖(XF->Y)
- 部分函数依赖(XP->Y)
- 传递函数依赖(XT->Z)
码:
除 K 之外的所有属性都完全函数依赖于 K,则K是候选码,简称码。
注:可以超过一个属性(如果码只有一个属性,则不存在非主属性对码的部分依赖)
主属性:
包含在任何一个码中的属性称为主属性
判断2NF:
- 第一步:找出数据表中所有的码。
- 第二步:根据第一步所得到的码,找出所有的主属性。
- 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
- 第四步:查看是否存在非主属性对码的部分函数依赖。
例:
函数依赖关系:学号—>姓名,学号—>系名,系名—>系主任,(学号,课名)->分数
- 码:(学号、课名)单独的学号或课名不能作为码,因为分数由学号、课名共同决定。
- 主属性:学号,课名
- 非主属性:姓名,系名,系主任,分数
对于(学号、课名)->系名,非主属性“系名”对码的部分函数依赖;
不符合2NF的要求。
对于(学号、课名)->系名,系名->系主任,非主属性系主任对码的传递函数依赖;
也不符合3NF。
3NF
3NF在2NF的基础之上,消除了非主属性对于码的 传递函数依赖。3NF是对字段冗余性的约束,即任何字段不能由其他字段派生,它要求字段没有冗余。
例1:
假设表中有单价、数量、金额,那么金额是冗余字段,因为它能由(单价*数量)得到。但是,增加金额字段,可以提高查询速度。
例2:
- 函数依赖集:仓库名->管理员,管理员->仓库名,(仓库名,物品名)->数量
- 码:(仓库名,物品名),(管理员,物品名)
- 主属性:仓库名,管理员,物品名
- 非主属性:数量
BCNF:
消除主属性对于码的部分函数依赖与传递函数依赖。
上例,主属性仓库名对码(管理员,物品名)的部分函数依赖。
模式分解
消除函数依赖
- 选课(学号,课名,分数)
- 学生(学号,姓名,系名)
- 系(系名,系主任)