4.3.4 第三范式

4.3.4 第三范式

【定义4.10】 如果一个关系模式R∈2NF,且所有非主属性都不传递函数依赖于任何候选码,则R∈3NF。

关系模式SL出现上述问题的原因是SLOC传递函数依赖于SNO。为了消除该传递函数依赖,可以采用投影分解法,把SL分解为两个关系模式:

SD(SNO,DEPT)

DL(DEPT,SLOC)

其中SD的码为SNO,DL的码为DEPT。

显然,在关系模式中既没有非主属性对码的部分函数依赖也没有非主属性对码的传递函数依赖,基本上解决了上述问题。

①DL关系中可以插入没有在校学生的信息。

②某个系的学生全部毕业了,只是删除SD关系中的相应元组,DL关系中关于该系的信息仍然存在。

③关于系的住处的信息只在DL关系中存储一次。

④当学校调整某个系的学生住处时,只需修改DL关系中一个相应元组的SLOC属性值。

3NF就是不允许关系模式的属性之间有这样的非平凡函数依赖X→Y,其中X不包含码,Y是非主属性。X不包含码有两种情况,一种情况X是码的真子集,这也是2NF不允许的,另一种情况X含有非主属性,这是3NF进一步限制的。

上例中的SD关系和DL关系都属于3NF。可见,采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题。

但是将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余。也就是说,属于3NF的关系模式虽然基本上消除大部分异常问题,但解决得并不彻底,仍然存在不足。

例如:关系模式SCG(SNO,SNAME,CNO,GRADE)中,SNO表示学号,SNAME表示姓名,CNO表示课程号,GRADE表示成绩。

如果姓名是唯一的,SCG模型存在两个候选码:(SNO,CNO)和(SNAME,CNO)。

SCG只有一个非主属性GRADE,对两个候选码(SNO,CNO)和(SNAME,CNO)都是完全函数依赖,并且不存在对两个候选码的传递函数依赖。因此SCG∈3NF。

但是当学生如果退选了所有课程,元组被删除也失去学生学号与姓名的对应关系,因此仍然存在删除异常的问题;并且由于学生选课很多,姓名也将重复存储,造成数据冗余。因此3NF虽然已经是比较好的模型,但仍然存在改进的余地。