三范式

1NF:
1NF比较简单:意思是说某个数据项不能再分(原子性)譬如下面这样的关系不能存在:
 
 
解决方法也很简单,拆成两个数据项:
 
2NF.当且仅当实体E是1NF,且每一个非键属性完全依赖主键(没有不完全依赖)时,则称实体E是2NF。
 
意思就是说这种情况(居多):
多对多的中间表中:
 
譬如学生选课,中间表SC(学号,课程号,成绩, 学分)这样的表就不满足2NF了。
 
因为这个表中,(学号,课程号)是主键。这个主键确定成绩,而对于学分来说,课程号->学分。所以,学分对主键是部分依赖。
 
所以要符合2NF就要拆分成两个关系:
SC(学号,课程号,成绩) 和C(课程号,学分)
 
不满足2NF会发生的问题:
a. 数据冗余,显而易见,当很多学生选了一门课之后,那个学分项会相应的重复
b.更新异常,当需要调整某门课的学分时,对应的数据都要更新。还可能会发生同一门课程存储的学分不同的情况(因为修改的是若干项,而不是一项)。
c.插入异常,如果新开一门课程,当没人选修的时候,没有学号关键字,学分无法存入
d.删除异常,如果学生结业了,从当前数据库中清除选修记录,某些课程新生还没选修,那么这门课程的学分记录也会被删除掉。
 
 
 
3NF.当且仅当实体E满足2NF的情况下:且E中没有非主属性传递依赖于码时,称实体E是3NF。
譬如这样的关系:
学生(学号,姓名,系号,系名,系地址)主键学号决定了其他的各个属性,所以满足2NF,但这个关系会有大量的数据冗余,学生所在系的几个属性:系号、系名、系地址会重复存储,在插入和删除、修改时也会产生类似于上面2NF那个例子中的情况。
造成这种情况的原因就是关系中存在传递依赖,就是说学号->系号,而系号->学号,系号->系地址,因此关键字学号对系地址的函数决定是通过传递依赖学号->系号来实现的,也就是说学号不直接决定非主属性系地址。
解决目的:每个关系模式中不能留有传递依赖
 
解决方法:拆分成两个关系学生(学号,姓名,系号),系(系号,系名,系地址)
注意:在学生这个关系中,不能没有系号这个关键字,它是外键。否则两个关系会失去联系。

你可能感兴趣的:(数据库,职场,三范式,休闲)