数据库中的范式

第一范式定义:表中所有字段仅包含单值。

 

很明显,第二行的数据违反了第一范式。因为phone的字段有两个值。PS:汗一个,美国人怎么连密码都是武器???

解决的办法有:

 

在讨论更高级的范式之前,必须明白确定因子的概念。

确定因子(determinant):是一个字段或一组字段,它控制或确定其他字段的值。

 

第二范式定义:表中的每个非键字段由整个主键确定,且不能由主键自身的一部分确定。因此,2NF的违例只会出现在主键是由超过一个字段构成的表中。

 

在上面的STUDENT_ENROLL表中id决定了fname,iname,dorm,phone,而SECTION$call_no又决定了fname,iname,dorm,phone,grade。违反了第二范式,则在更新时,由于Jim Green有两个电话号码而无法更新。

解决的办法有:

 

第三范式定义:表中不存在可以确定其他非关键字的非键字段。

3NF的违例可能发生在具有多个非键字段的表中。

数据库中的范式

 

上图的MEMBERVISIT中,主键(id)决定了email,password,fname,iname,phoneEmail决定了password,fname,iname,phone。所以违反了第三范式。会导致Luce存储了两个passwords.。这显然是不对的。

解决的方法:

数据库中的范式

 

鲍依斯-科得范式(BCNF):在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合第三范式。

   假设仓库管理关系表为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范式的,消除了删除异常、插入异常和更新异常。 
 

第四范式定义:在全键表中,键的一部分可以确定至多一个其他字段的多个值。4NF仅用于全键表。

为了理解第四范式,需要引入多值依赖(multivalued dependency,MVD)的概念:指可以控制或确定另一个字段的多个值的一个或一组字段。

数据库中的范式

 

上面的SKILL表中,email是多值依赖的。违反了第四范式。如果我们删除了LuceGerman身份。我们也丢失了他爱好网球的信息。

解决方法:

 

这两个表是没有联系的。每个表仅包含一个MVD

 

检测范式违例:

1.                   当多个值存储在一个单元中时会发生1NF违例。

2.                   2NF违例只会发生在具有关联键的表中,且非键字段只依赖于主键的一部分。

3.                   3NF违例发生在一个非键字段确定另一个非键字段的情况下,表可能有一个任何大小的键。

4.                   BCNF违例出现在非键字段确定主键的一部分的情况下。这些违例只能发生在主键是有关联键组成的表中。

5.                   4NF违例发生在表的主键至少由3个键连接而成且没有非键字段的情况下,此外,键的一部分确定键的另一部分的多个值。

 

解决范式违例的方法:就是将复式的确定因子拆成单一的确定因子。

你可能感兴趣的:(工作)