您的位置:首页 > 数据库

关于数据库几种范式的理解

2010-01-17 11:19 218 查看
范式分类:1NF,2NF,3NF,BCNF,4NF

1,第一范式

数据库表中的字段都是单一属性的,不可再分。这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。

它只是一些属性的堆积,但是每个是不能再分的。

2,第二范式

在第一范式的基础上,第二范式要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。这个惟一属性列被称为主关键字或主键、主码。

3,第三范式

用定义来描述就是:

关系模式R<U,F>中若不存在这样的码X,属性组Y及非主属性Z(Z≮Y)使得X->Y,Y->Z成立,Y!->X,则称R<U,F>∈3NF.

这样理解确实有点费解,那么我们用一个实际的例子来说明即可.

假定学生关系表为Sn(学号, 姓名, 年龄, 所在[]学院[], 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:

(学号) → (姓名, 年龄, 所在[]学院[], 学院[]地点, []学院[]电话)

这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:

  (学号) → (所在[]学院[]) → ([]学院[]地点, []学院[]电话)

  即存在非关键字段"[]学院[]地点"、"[]学院[]电话"对关键字段"学号"的传递函数依赖。

  它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。

  把学生关系表分为如下两个表:

  学生:(学号, 姓名, 年龄, 所在[]学院[]);

  []学院[]:([]学院[], 地点, 电话)。

  这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。

4,BC范式

BCNF(Boyce Codd Normal Form)是由Boyce与Codd提出的,比3NF又进了一步,通常认为BCNF是修正的第三范式,有时也成为扩充的第三范式。

定义:所谓第三范式,定义是关系模式R<U,F>中若不存在这样的码X,属性组Y及非主属性Z,使得X—>Y,Y—>Z成立,(不存在Y—>X),则称R<U,F>为3NF.

实例理解:

假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系:

   (仓库ID, 存储物品ID) →(管理员ID, 数量)

   (管理员ID, 存储物品ID) → (仓库ID, 数量)

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

   (仓库ID) → (管理员ID)

   (管理员ID) → (仓库ID)

   即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。它会出现如下异常情况:

   (1) 删除异常:

   当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。

   (2) 插入异常:

   当仓库没有存储任何物品时,无法给仓库分配管理员。

   (3) 更新异常:

   如果仓库换了管理员,则表中所有行的管理员ID都要修改。

   把仓库管理关系表分解为二个关系表:

   仓库管理:StorehouseManage(仓库ID, 管理员ID);

   仓库:Storehouse(仓库ID, 存储物品ID, 数量)。

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

5,第四范式

待续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: