数据库范式简介

一、基本介绍

 

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多规范要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。

范式的包含关系。一个数据库设计如果符合第二范式,一定也符合第一范式。如果符合第三范式,一定也符合第二范式…

 

数据库基本概念

       要理解范式,首先必须对知道什么是关系数据库,简单的说:关系数据库就是用二维表来保存数据。表和表之间可以……(省略10W字),如果对数据库很熟悉,可以不用理会下面的概念。

 

      实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,不如说“老师与学校的关系”。

      属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库

中,属性又是个物理概念,属性可以看作是“表的一列”。

     元组:表中的一行就是一个元组。

     分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

      码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫   候选码,我们从候选码中挑一个出来做老大,它就叫主码。

     全码:如果一个码包含了所有的属性,这个码就是全码。

     主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

     非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

 

     外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

 

     候选码: 若关系中的某一属性或属性组的值能唯一的标识一个元组,而其任何真子集都不能再标识,则称该属性组为(超级码)候选码。

二、关系+例子

 

1NF

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

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


       错误:

              

       正确一:

              

       正确二:

             

2NF

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

 

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

            

                  (学号、课程号)→姓名

                  学号→姓名

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


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

                            


3NF

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

 

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

           

                学号→系名→系主任

                学号→系主任

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

 

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

                       


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


BCNF

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

 

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

                    

      存在关系:

                  书号→书名

                  (书名、作者)→书号

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

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

                   (书名、作者)→书名   

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

                            

4NF

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

 

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

 

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



课程→学生

课程→先修课

 

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

                               

5NF 

          消除不是由候选码所蕴含的连接依赖

                          http://blog.sina.com.cn/s/blog_a637e97e0101321t.html
                           https://www.zhihu.com/question/24696366

反范式

                         http://blog.csdn.net/qq_33290787/article/details/51956532


猜你喜欢

转载自blog.csdn.net/ruthywei/article/details/80815693