关系数据库规范化
在了解规范化范式之前我们先来了解下函数依赖
——什么是函数依赖呢?
1、函数依赖
- 函数依赖:设 X,Y 是关系 R 的两个属性集合,当任何时刻 R 中的任意两个元组中的 X 属性值相同时,则它们的 Y 属性值也相同,则称X函数决定 Y,或Y函数依赖于 X。记作X→Y 。函数依赖简单点说就是:某个属性集决定另一个属性集时,称另一属性集依赖于该属性集。
- 完全函数依赖:在R(U)中,如果X→Y,并且对 X 的任意一个真子集 X’ 都有X’ 不能决定 Y,则称 Y 对 X 完全函数依赖。
- 部分函数依赖:如果 X→Y,但Y不完全依赖于 X,则称 Y 对 X 部分函数依赖,部分函数依赖也称为局部函数依赖。
- 传递函数依赖:在R(U,F)中,如果 X→Y,Y∉X,Y→Z。则称 Z 对 X 传递函数依赖。
2、规范化
范式有 1NF、2NF、3NF、BCNF、4NF、5NF,其中 1NF 的级别最低。通常可以通过判断分解后的模式达到第几范式来评价模式规范化程度。通过分解可以将一个低一级范式的关系模式转化成若干个高一级范式的关系模式,这个过程就叫做规范化。
下面介绍常见的 1NF、2NF、3NF:
- 1NF(第一范式)
如果一个关系模式R的所有属性都是不可再分的数据项,则 R∈1NF。
例如:如下关系模式 FIRST 和其函数依赖集F:
FIRST(Sno,Sname,Status,City,Pno,Qty)
F = { Sno→Sname,Sno→Status,Status→City,(Sno,Pno)→Qty }
Sno | Sname | Status | City | Pno | Qty |
---|---|---|---|---|---|
S1 | 精益 | 20 | 天津 | P1 | 200 |
S1 | 精益 | 20 | 天津 | P2 | 300 |
S1 | 精益 | 20 | 天津 | P3 | 480 |
S2 | 盛锡 | 10 | 北京 | P2 | 168 |
S2 | 盛锡 | 10 | 北京 | P3 | 500 |
从表中可以看出,每个属性都是不可再分的数据项,所以是 1NF。
但是从表中可以分析出 1NF 其实存在以下 4 个问题。
- 冗余度大
- 引起修改操作不一致性
- 插入异常
- 删除异常
因此需要对模式进行分解,引入更高范式。
-
2NF(第二范式)
若关系模式 R∈1NF,且每一个非主属性完全依赖于主键,则关系模式 ∈2NF。换句话说,当1NF消除了非主属性对码的部分函数依赖,则属于2NF。
例如,FIRST关系中码 Sno,Pno,而Sno→Status,因此非主属性Status部分函数依赖于码,故非 2NF。
此时如果将FIRST这样分解:
FIRST1(Sno,Sname,Status,City)
FIRST2(Sno,Pno,Qty)
则 FIRST1∈2NF,FIRST2∈2NF。因为分解后依照函数依赖集 F 可知,FIRST1 中非主属性 Sname,Status,City 完全依赖于主键Sno;FIRST2 中 Qty 也完全依赖于主键(Sno、Pno)。 -
3NF(第三范式)
当2NF消除了非主属性对码的传递函数依赖,则称为 3NF。因此 3NF 既消除了非主属性对码的部分函数依赖,又消除了非主属性对码的传递函数依赖。
例如:FIRST1是∉3NF的,因为在分解后的关系模式FIRST1中有 Sno→Status,Status→City,即存在着非主属性City传递依赖于码Sno。
此时如果继续将FIRST1分解为:
FIRST1#1(Sno,Sname,Status) ∈3NF
FIRST1#2(Status,City) ∈3NF -
BCNF范式
3NF的规则是:在满足第2NF的规则的基础上,非主键属性必须直接依赖于主键。而BCNF的规则是:在满足3NF基础上,消除任一属性对候选键的传递函数依赖。 也就是说,要想达到BCNF的标准,还要在3NF的基础上基础拆分表。这里不是很常用就不在追溯了。