数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)

    近期在学习数据库范式,这很是让博主纠结了一阵呢,所以简单总结一下,奉上一点案例分析,与您分享~

 

一、概念

 

     R-关系模式

     r-关系

     U-属性集

     FD-函数依赖

     X→Y:"X函数决定Y","Y函数依赖于X"。

     AB   A包含于B,A小,B大,B→A

 

     元组:二维表中的行

     属性:二维表中的列

 

     超键:能唯一标识元祖的属性集

     候选键:不含多余属性的超建

     主键:用户选作元组标识的候选键

     外键:对于当前模式而言,是另一模式下的主键。

     主属性:构成候选键的属性

 

     局部依赖与完全依赖:对于FD W→A,如果存在X包含于W,有X→A成立,那么称W→A是局部依赖,否则成W→A是完全依赖。

 

二、关系+例子

 

1NF

       每个关系r的属性值为不可分的原子值

 

       当赵同学有两个手机号时,他不能将两个手机号存储在一个属性框中,需要分开存放,如下表所示。

 

       错误:

             

       正确一:

              数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第1张图片

       正确二:

            

 

2NF

  满足1NF,非主属性完全函数依赖于候选键(左部不可约)

 

  若一张表的数据包括:“学号、姓名、课程号、授课老师”中,设“学号、课程号”为主键,其中,一门课程可以有多个老师进行授课。会存在如下关系:

            

 

                  (学号、课程号)→姓名

                  学号→姓名

                                 ---------为局部依赖,即候选键的一部分可以推出非主属性系名

 

         可分解为两个表,达到完全依赖:“学号、姓名”与“学号、课程号、授课老师”

                            

 

 

3NF

  满足2NF,消除非主属性对候选键的传递依赖

 

  若一张表的数据包括:“学号、系名、系主任”,其中“学号”为主键,存在如下关系:

          

 

                学号→系名→系主任

                学号→系主任

                            ---------为传递依赖

 

        同样可分解为两张表:“学号、系名”和“系名、系主任”

                       

 

     对于第三范式,我们反过来理解也是可以的,在表1(学号、系名),表2(系名、系主任)中,学号和系名都是各自表中的主键,所以系名依赖于学号,系主任依赖于系名。当三个数据放置在一张表中时,学号是可以推出系主任的。你可以理解为通过看学生张小二的学号,是可以推理出他的系主任是谁的。

 

 

BCNF

   满足3NF,消除每一属性对候选键的传递依赖

 

   若一张表的数据包括:“书号、书名、作者”其中,书号是唯一的,书名允许相同,一个书号对应一本书。一本书的作者可以多个,但是同一个作者所参与编著的书名应该是不同,希望没有说晕,看图看图。

                    数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第2张图片

 

      存在关系:

                  书号→书名

                  (书名、作者)→书号

      其中,每一个属性都为主属性,但是上述关系存在传递依赖,不能是BCNF。即:

                  (书名、作者)→书号→书名

                   (书名、作者)→书名   

      我们可以通过分解为两张表,实现BCNF。

              数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第3张图片              数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第4张图片

 

4NF

   满足BCNF,消除非平凡且非FD的多值依赖(MVD)

 

   非形式说:只要两个独立的1:N联系出现在一个关系中,那么就可能出现多只依赖。举例说明。

 

   一个表中存在三个数据:“课程、学生、先修课”。假设2017级的计算机专业学生想要学习JAVA课程,那么他们需要先学习VB、C#、BS三门课,才可以选择进行JAVA课程。存在关系:

 

数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第5张图片

 

 

课程→学生

课程→先修课

 

    两个均是1:N的关系,当出现在一张表的时候,会出现大量的冗余。所以就我们需要分解它,减少冗余。(Ps:该例子主要是为了说明概念帮助理解,具体应用中不会只是这样的简单粗暴的。)

                  数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第6张图片             数据库范式简单讲解(1NF、2NF、3NF、4NF、BCNF)_第7张图片

 

  说明:关于上面的例子,主要是为了帮助理解范式,如有错误,敬请各位读者指出。感谢您的阅读。

你可能感兴趣的:(【学历深造】,——【自考】)