对第一范式(1NF) 第二范式(2NF) 第三范式(3NF)的理解

来源:互联网 发布:淘宝店铺在哪里买 编辑:程序博客网 时间:2024/04/30 01:36

要找工作了,今天把当初学校里的SQL实训教程看了一番。看到了关于1NF,2NF,3NF的介绍,结果看得是一头雾水

这是教程里的定义:

第一范式(1NF):如果关系模式R的每一个关系r的属性值都是不可分的原子值,那么称R是第一范式(1NF)的模式。

第二范式(2NF):如果关系模式R1NF,且每个非主属性完全函数依赖于候选键,那么称R是第二范式(2NF)的模式。

 

 

自己做了一些总结,我觉得可以这样理解:

衡量一个关系模式的标准就是模式的范式。范式有很多,最主要的是3NF。可以有效地减少数据的冗余和操作异常。

 

第一范式:其实我见到的表都是符合第一范式规则的,只能举出不符合第一范式的例子来理解

 

 

  Name    Address    Phone

  Tom     add1       phone_1

                             phone_2

  Anne    add2       phone_3

 

 

这里同一个字段(Phone)有两个值,所以是不符合第一范式规则的。

 

第二范式:关系模型中不存在局部依赖的。

 

例如:有这样一组关系:

关系模式R(S# ,C# ,Grade ,Tname ,Taddr)的属性分别表示学生学号、选修课程的编号、成绩、任课教师姓名和教师地址

这里有这样的 C# ->Thname, (S#,C#)->Thname 局部依赖关系,所以它是不符合第二范式规则的。

这样就会给数据库带来冗余,比如有N个学生,Thname,Taddr就会重复N次

 

对定义中局部依赖的理解 ,

W→A,如果存在X属于 W,有X→A成立,那么称W→A是局部依赖(A局部依赖于W);否则若不存在这种X,称W→A是完全依赖。

例如:(S#,C#)->Thname, C#->Thname, 且C#属于(S#,C#),所以(S#,C#)->Thname是局部依赖,C#->Thname是完全依赖。

 

如果改成这样:

R1S# C# Grade)

R2C# Tname Taddr

这样的关系就是符合第二范式规则的了。消除了冗余。

 

第三范式:不存在传递的依赖关系

还是以上个例子说:

R2(C# Tname Taddr) 符合了第二范式规则,但是有这样一个关系C#->Thname, Thname->Taddr则有这样的传递依 赖关系

C#->Taddr。这样如果一个老师开N门课程,则Taddr就会被重复N次

 

R2分解:R21C# TnameR22Tname Taddr)这样的关系模式就不存在传递依赖,符合第三范式规则。