Sql入门学习——关系范式

--------关系

--------范式

一、三种关系

1、一对一关系

关系数据库中,第一个表中的单个行只可以与第二个表中的一个行相关,且第二个表中的一个行也只可以与第一个表中的一个行相关。

2、一对多关系

关系数据库中,第一个表中的单个行可以与第二个表中的一个或多个行相关,但第二个表中的一个行只可以与第一个表中的一个行相关。

一对多并不是一对多列,列不能一对多,只能一对多行。

一对多关系,一般是一个表的主键对应另一个表的非主键,主键的值是不能重复的,而非主键值是可以重复的,
一个主键值对应另一个表的非主键的值,那么就只有一个值对一个值或一个值对多个值两种可能,故称一对多。

3、多对多关系

关系数据库中,第一个表中的一个行可以与第二个表中的一个或多个行相关。第二个表中的一个行也可以与第一个表中的一个或多个行相关。

举个栗子:

科目表与学生表,这俩个表存在这种现象:一个科目存在多个对应的学生,一个学生也可以学习多个科目.

这种现象为多对多关系,要表示多对多的关系,必须创建第三张表"链接表",然后将前两张表中的主键存入链接表,通过链接表记录匹配关系.

二、范式

1、1NF(第一范式)

1NF的定义为:符合1NF的关系中的每个属性都不可再分。

第一范式是指数据库表中的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。

如下表所示,不符合1NF:

简而言之,第一范式就是无重复的列。

  例如,

由“职工号”“姓名”“电话号码组成的表(一个人可能有一部办公电话和一部移动电话),

这时将其规范化为1NF可以将电话号码分为“办公电话”和“移动电话”两个属性,即职工(职工号,姓名,办公电话,移动电话)。

再如下图所示

          虽然符合1NF,但是存在冗余过大/插入异常/删除异常/修改异常

          

①每一名学生的学号、姓名、系名、系主任这些数据重复多次。每个系与对应的系主任的数据也重复多次——数据冗余过大

②假如新增系,无法单独添加系名与系主任——插入异常

③假设与某个系相关的学生全部删除,那么该系都会被删除——删除异常

④假设一名同学转系,为了保证数据库数据的统一性,需要修改三条记录中系与系主任的数据。——修改异常。

正因为仅符合1NF的数据库设计存在着这样那样的问题,我们需要提高设计标准,去掉导致上述四种问题的因素,使其符合更高一级的范式(2NF),这就是所谓的“规范化”。

2、第二范式

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

2NF在1NF的基础之上,消除了非主属性对于码的部分函数依赖。

例如,

在选课关系表(学号,课程号,成绩,学分),关键字为组合关键字(学号,课程号),

但由于非主属性学分仅依赖于课程号,对关键字(学号,课程号)只是部分依赖,而不是完全依赖,

因此此种方式会导致数据冗余以及更新异常等问题,解决办法是将其分为两个关系模式:

            学生表(学号,课程号,分数)和课程表(课程号,学分),

新关系通过学生表中的外关键字课程号联系,在需要时进行连接。

3、第三范式

NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖。也就是说, 如果存在非主属性对于码的传递函数依赖,则不符合3NF的要求。

以学生表(学号,姓名,课程号,成绩)为例,其中学生姓名无重名,

所以该表有两个候选码(学号,课程号)(姓名,课程号),故存在函数依赖:

                学号——>姓名,(学号,课程号)——>成绩,

唯一的非主属性成绩对码不存在部分依赖,也不存在传递依赖,所以属性属于第三范式。

4、BC范式

构建在第三范式的基础上,如果关系模型R是第一范式,且每个属性都不传递依赖于R的候选键,那么称R为BCNF的模式。

假设仓库管理关系表(仓库号,存储物品号,管理员号,数量),满足一个管理员只在一个仓库工作;一个仓库可以存储多种物品,则存在如下关系:

(仓库号,存储物品号)——>(管理员号,数量)

(管理员号,存储物品号)——>(仓库号,数量)

所以,(仓库号,存储物品号)和(管理员号,存储物品号)都是仓库管理关系表的候选码,表中唯一非关键字段为数量,它是符合第三范式的。但是,由于存在如下决定关系:

(仓库号)——>(管理员号)

(管理员号)——>(仓库号)

即存在关键字段决定关键字段的情况,因此其不符合BCNF。

把仓库管理关系表分解为两个关系表仓库管理表(仓库号,管理员号)和仓库表(仓库号,存储物品号,数量),

这样这个数据库表是符合BCNF的,并消除了删除异常、插入异常和更新异常。

 

posted @ 2018-03-17 16:58  刘半封  Views(524)  Comments(0Edit  收藏  举报