数据库的三范式

来源:互联网 发布:php社区源码 编辑:程序博客网 时间:2024/05/17 03:05

第一范式(1NF):

       字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式)

       数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,如果要区分出姓和名,必须设计成两个独立的字段。 

第二范式(2NF):

        第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。 要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。

        第二范式(2NF)主要消除部分函数依赖,要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字,而消除部分函数依赖的方法就是创建新表。

        例如选课表SC中,学号Sid和课程号Cid为联合主键,表中其他字段不能只依赖单个主码中的字段存在,如表中不能出现学生名Sname和课程名Cname这样的字段,必须同时依赖联合主键时才可以存在,如该生在这门课程的成绩grade,就是联合主键所共同决定的一个字段。

第三范式的要求如下:

    满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。

所以第三范式具有如下特征:
         1,每一列只有一个值

         2,每一行都能区分。

         3,每一个表都不包含其他表已经包含的非主关键字信息。

    例如,上个例子中说到的选课表SC,表中只能出现学生的id,而不能出现学生id同时还存在学生的姓名,否则,只要出现同一学生id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。

第三范式主要消除的是传递函数依赖

如表s(sno,sdept,sloc),字段sno是主码,sno—>sdept,也有sdept—>sloc,此时就出现的传递函数依赖,按照第三范式的特征讲表分成s1(sno,sdept)和s2(sdept,sloc),表s1中的sdept依赖于s2中的sdept字段,此时就消除了传递函数依赖

原创粉丝点击