数据库学习之-------三大范式

为什么会出现三大范式呢?什么是三大范式?首先我们需要来理解以下的基本概念:
         关系:数据库中的一张二维表
         数据依赖:数据间的相互关系
         函数依赖:属于数据依赖的一个分支,前者数据值确定后,后者数据值唯一指定,也就是说后者数据的值依赖前者!例如:由于一个学号只对应一个学生,一个学生只在一个系,所以当学号确定后,他的姓名以及所在的系就唯一确定了。
         然后,我们来建立一个数据库,该数据库涉及的对象包括学号(Sno)、所在系(Sdept)、每个系的学生住处(Sloc)、选修课程号(Cno)和成绩(Grade),我们得到该关系模式:
          SLC(Sno,Sdept,Sloc,Cno,Grade)
          它的主码:由Sno和Cno共同决定!
 范式:符合某一种级别的关系模式的集合
         1.第一范式:如果一个关系模式中的所有属性都是不可分的基本数据项,那么就属于第一范式,基本上所有关系模式都满足第一范式!
 所以上述建立的数据库也属于第一范式!
 数据库之间的函数依赖包括:
          (Sno,Cno)--->Grade
            Sno--->Sdept
          (Sno,Cno)--->Sdept
            Sno--->Sloc
          (Sno,Cno)--->Sloc
            Sdept--->Sloc(因为每个系只住在一个地方)
 通过实际生活,我们发现这个关系存在如下一些问题:
 (1)插入异常:假如要插入一个未选课学生的信息,因为主码丢失,所以插入异常
 (2)删除异常:加入一个学生不选修3号课程了,那么我们必须将他的选修3和课程删除,但课程号是主码,删除整条学生记录会跟着删除,即不应该删除的信息也删除了
 (3)数据冗余度大:如果一个学生选修了10门课程,那么他的Sdept和Sloc就会在数据库中重复存储10次
 (4)修改复杂:假如一个学生选修了10门课程,但后来转系了,那么我们就要重复修改每一条Sdept和Sloc的值
 因为出现了上述这些问题,为了解决,出现了第二范式:
 分析原因:Sdept,Sloc非主属性对码的部分函数依赖
         2.第二范式:在第一范式的关系模式上消除部分函数依赖,分解形成的关系模式
 将上述关系模式SLC分解成如下两个关系模式:
              SC(Sno,Cno,Grade)
              SL(Sno,Sdept,Sloc)
 分解后的关系模式中,可以发现,非主属性完全依赖主码!
 解决了第一范式遗留的问题:
 (1)在SL关系中可以插入尚未选课的学生记录
 (2)删除某学生的选修记录只需要在SC关系中进行,不会影响该学生在SL关系中的信息
 (3)某个学生选修10门课程,只需要在SL关系中存储一次Sdept和Sloc的值
 (4)某个学生转系后,也只需要在SL关系中修改一次该学生Sdept和Sloc的值

 但是通过实际生活,我们发现这个关系也存在如下一些问题:
 (1)插入异常:如果某个原因,某个系刚成立,还没有学生,那么因为没有主码的支持,该系的信息就无法存入数据库中
 (2)删除异常:如果某个系学生全部毕业了,在删除该系学生记录的同时,也将这个系的信息丢掉了!
 (3)数据冗余度大:每一个系的学生都住在一个地方,关于系的住处的信息却重复出现,出现的次数与该系的学生人数有关
 (4)修改复杂:当某个系的地址发送改变时候,该系所以学生的Sloc都有重复修改
 因为出现了上述这些问题,为了解决,出现了第三范式:
 分析原因:Sloc传递函数依赖与Sno
         3.第三范式:在第二范式的关系模式上消除传递函数依赖,分解形成的关系模式
 将上述关系模式SL分解成如下两个关系模式:
          SD(Sno,Sdept)
          DL(Sdept,Sloc)
 解决了第二范式的遗留问题:
 (1)在DL关系中可以插入无在校学生的系的信息
 (2)某个系的学生全部毕业了,只是删除了SD中的记录,对DL中系的信息没影响
 (3)每个系的学生的Sloc只需要在DL中存储一次
 (4)某个系地址改变,也只需要在DL中改变一次Sloc的值

         当然了,第三范式也会有些问题,在此基础上又会形成多个不同类型的范式,但是并不意味着关系的规范化程度越高越好,在此仅介绍了三大范式,想了解其他范式的可以查阅相关资料。
         总结:三大范式其实是对原有数据库关系出现某些问题的一种解决思想,即将原先数据库表尽可能一步步进行解耦,消除原先数据依赖中不合适的部分,使各个关系模式达到某种程度上的分离!本质既可以解决逻辑上对数据库操作的异常,也可以解决数据库内存冗余响应慢等问题,所以在数据库设计中极其重要!!!
 

你可能感兴趣的:(数据库)