如果一个表中不包含任何重复的组,即对于任意一行,任一列中都不应该具有多个值,则称该表满足1NF。言外之意,一个非规范化的表将包含一个或多个重复组。当一个表中的某个属性出现了多重值,就是出现了重复组。
总结起来,如果一个表(关系)满足了以下条件,就满足1NF:
(1)表中没有重复的行;
(2)每个单元都是单值的(即没有重复组或数组);
(3)一个列中的实体(属性,字段)属于同一类型。
注解:行和列的顺序无关紧要。表中没有重复行的要求是指该表有一个键(一列或者一组列).
为了使表满足1NF,必须首先消除重复组,它通常由存储在行和列的交集中的多重值标识。例如,若一个雇员有几种技能,必须在此雇员的SkillID列中给出多个值,或者把同一个雇员用几行来表示,每个技能一行,但两者都不是最好的方法。把此表简化成1NF表的方法是将其分解幵来,使得每个属性或列中只有一个单一的值。给每组相关的属性创建一个単独的表,并给每个表一个主键。
在本例中,是把技能属性移到另一个表中。把技能的重复组与雇员数据分离将产生两个1NF表。将Skills表中的Employee Number与Employee表中的主键相匹配,只要定义一个外键,使这两个表与一个联结操作相关即可
现在可以用一个直接检索来回答有关John Thomas是否具有 会计技能的问题了。查找Thomas的Employee Number和会计学的 Skill ID是否一起出现在了Skills表中。请注意,在Skills表中,主键是由Employee Number及Skill ID组成的多值键或组合键(composite key)。
如果一个表已经满足1NF旦每个非键属性与主键完全函数依赖,那么该表满足2NF。因为在非健属性只与(组合)键的--部分依赖时出现部分依赖性,所以,2NF的定义也可以这样表达:
如果一个表满足1NF且没有部分依赖性,则该表满足2NF.
首先来考察一个表满足1NF但不满足2NF的情形。表2-4满足1NF,因为它不包含重复组。但是数据中存在冗余,因为同一个Skill Name(例如会计学)出现在拥有此技能的每个雇员记录屮。在该表 中,只要有Skill ID列本身就足以表示技能。回顾上一节,在Skills表中,主键是由Employee Number和Skill ID组成的多值(组合)键。但是,Skill Name只依赖于该组合键的一部分(Skill ID)。
| Employee Number | Skill ID | Skill Name | Skill Level |
|---|---|---|---|
| 22 | 130 | Accounting | 9 |
| 23 | 140 | Marketing | 9 |
| 24 | 130 | Accounting | 7 |
在上一小节的Skills表中,主键由Employee Number和Skill ID组成。这对Skill Level属性很有意义,因为针对每个雇员-技能的组合它是不同的。但是,Skill Name只依赖于Skill ID,因此当一个列只依赖于一部分主键时,就称作部分依赖性。SkillNamc反映出了部分依赖性,因为它只与Skill ID存在联系
而Skill ID只是主键的一部分 Skill Name并不依赖于Employee Number,但Employee Number是主键的另一部分。因此,每当与Skill Name相关联的Skill ID出现在Skill表时,相同的Skill Name将重复出现。这种冗余可能导致更新和删除异常。
例如,假设要通过给定不同的Skill ID对技能进行重新分类。在这种情形下,如何确保具有此项技能的每个雇员的信息都做出相应的变化是很头疼的事情。倘若遗漏了某些雇员,那么具有相同技能的雇员可能会有不同的ID号一这是更新异常。如果只有一个雇员具有某项特定的技能,并且该雇员碰巧离职,该雇员的数据将从数据库中删除,那么这项技能将彻底从数据库中消失了——这是删除异常。
为了避免此类的问题,必须使表满足2NF。将表分解成更为简单的形式,使其摆脱部分键的依赖性。也就是,所有非键属性对于主键都应该是完全函数依赖的。为了实现这一点,必须将同时依赖主键的两个部分的属性与只依赖于Skill ID的那些属性分开。
这样就形成了两个表:列出每个Skill ID的名称的Skills表和列出每个雇员实际掌握的技能的Employee Skills表.在Employee Skills表中,Skill Level属性无疑依赖于主键的两个部分,因为该属性不仅基于特定的技能,也基于特定雇员在该技能上获得的等级。
现在,任何雇员都不具有的技能也可以放在数据库中了并且也可以用一个单独的操作对技能进行重新分类了--只要査找Skills中的Skill ID并修改其名称即可。还可以删除雇员的信息而不会丢失有关技能本身的信息。
如果一个表满足2NF且每个非键属性完全并直接依赖于主键,那么该表满足3NF。即,要满足3NF,必须消除不依赖于键的列。如果一个属性不能描述键,就将其移到另一个表中。
Employees表满足INF,因为它不包含重复组。它也满足2NF,因为它没有组合键。但 是,该表的键是Employee Number,可以发现,Department Name和Department Location列都不依赖于Employee Number(表的主键)它们依赖于Department Number列的值。为了实现3NF,必须将部门信息移到另一个表中。可以令Department Number为新Department表的键。
如果所有非键属性都完全且仅依赖于全部主键,那么该关系满足3NF。




