【摘要】:不属于1NF的关系称为非规范化关系,见表1.4;经过转化形成规范化的关系,记作关系模式SCD,见表1.5。表1.4非规范化关系表1.5规范化关系第一范式还可以理解为:每一个数据项都不能拆分成两个或两个以上的数据项。表1.6SC表表1.7SD表这两个表都不存在部分依赖,它们都是第二范式。表1.8S表表1.9D表可以看出,S表和D表各自描述单一的现实事物,都不存在传递依赖关系,都是第三范式。
关系数据库范式理论是在数据库设计过程中将要依据的准则,数据库结构必须要满足这些准则,才能确保数据的准确性和可靠性。这些准则被称为规范化形式,即范式。
在数据库设计过程中,对数据库进行检查和修改并使它返回范式的过程称为规范化。关系规范化的基本方式是逐步消除关系模式中不合适的数据依赖,使模式达到某种程度的分离,也就是说,不要将若干事物混在一起,而要彼此分开,用一个关系表示一事或一物,所以,规范化的过程也被认为是“单一化”的过程。
范式按照规范化的级别分为5种:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)和第五范式(5NF)。在实际的数据库设计过程中,通常需要用到的是前三种范式,下面对它们分别介绍。
1.第一范式(1NF)
设R是一个关系模式,如果R中的每个属性都是不可分解的,则称R是第一范式。第一范式的要求是不能表中套表,它是关系模式最基本的要求,数据库模式中的所有关系模式必须是第一范式。
不属于1NF的关系称为非规范化关系,见表1.4;经过转化形成规范化的关系,记作关系模式SCD,见表1.5。
表1.4 非规范化关系

表1.5 规范化关系(SCD表)

第一范式还可以理解为:每一个数据项都不能拆分成两个或两个以上的数据项(保证其原子性)。例如,在表1.4的数据中,个人信息是由学号、系别、住址组成的,选课信息是由课程名、成绩组成的,因此,这个表1.4不满足第一范式。
2.第二范式(2NF)
如果一个表已经满足第一范式,而且该数据表中的任何一个非主键字段的数值都依赖于该数据表的主键字段,那么该数据表满足第二范式。
表1.5 所示的表SCD(学号,系别,住址,课程名,成绩)不是第二范式,因为该表的主键是学号和课程名,对于非主键字段住址和系别来说,只依赖于学号,而与课程名无关,即该表存在如下存储问题。
(1) 数据冗余:住址和系别都有数据重复。如,“本部”和“计算机系”都重复了3次。
(2) 更新异常:冗余信息不仅浪费存储空间,而且会增加更新的难度。如,把“计算机系”的住址修改为“重大校区”,则需要修改所有包含该值的行(3行)。如果由于某种原因,没有更新所有行,则数据库中的“计算机系”的“住址”就会有两个地方,一个是“本部”,另一个是“重大校区”,从而出现了不一致的情况。
(3) 插入异常:在表1.5中学号或课程名称不能单独作为主键,需要采用组合键作为主键,假设表1.5所示的SCD表的主键为(学号,课程名称)。任何要插入到该表中的行必须提供主键的值,因为主键的值不能为空。如果“计算机系”开了一门新的课程“Java编程”,即要向该表中插入一行数据,但现在还没有学员选修,将无法插入这条数据。
(4) 删除异常:在某些情况下,当删除一行时,可能丢失有用的信息。如,删除表1.5中学号为“ZXT1220004”的行,就会丢掉“人文系”这个系的信息。
解决上面问题的办法是将非第二范式的表分解为若干个第二范式的表。分解的方法如下所述。
(1) 把关系模式中完全依赖于主键字段的非键字段与决定它们的键字段放在一个表中。
(2) 把只部分依赖于主键的非键字段和决定它们的键字段放在一个表中。
(3) 检查分解后的新表,如果仍不是2NF,则继续按照前面的方法进行分解,直到达到要求。(www.chuimin.cn)
对于表SCD来说,成绩属性完全依赖主键(学号,课程名),可将它们放在一个表中;字段“住址”和“系别”只依赖学号,可将它们放在另一个表中。得到的分解结果见表1.6和表1.7。
表1.6 SC表

表1.7 SD表

这两个表都不存在部分依赖,它们都是第二范式。虽然消除了数据的插入异常,但仍然存在其他存储问题。从表SD包含了学生和系两方面的信息来看,该模式仍然存在问题,有待进一步分析,这就需要更高级别的范式。
3.第三范式(3NF)
如果一个表已经满足第二范式,而且该数据表中没有一个非键字段传递依赖于主键,那么该数据表满足第三范式。
传递依赖关系是造成删除异常的原因。第三范式消除了传递依赖部分,因此解决了数据的删除异常问题。
例如,表SD(学号,系别,住址)是表SCD的分解结果,它仍然存在问题。该表中存在着学号->系别,系别->住址,即“住址”传递依赖于“学号”而不是直接依赖于“学号”,因此表SD不是第三范式,存在删除异常问题。解决的办法是消除其中的传递依赖,将表SD进一步分解为若干个独立的第三范式的表。分解的方法如下所述。
(1) 把直接对主键依赖的非键字段与决定它们的主键放在一个表中。
(2) 把造成传递依赖的决定因素连同被它们决定的字段放在一个表中。
(3) 检查分解后的新模式,如果不是3NF,则继续按照前面的方法进行分解,直至达到要求。
对于表SD来说,“系别”直接依赖于主键“学号”,可将“学号”和“系别”放在一个表中。“系别”决定“住址”,“系别”是造成传递依赖的决定因素,则将“系别”和“住址”放在另一个表中。得到的分解结果见表1.8和表1.9。
表1.8 S表

表1.9 D表

可以看出,S表和D表各自描述单一的现实事物,都不存在传递依赖关系,都是第三范式。
一个表达式3NF,则基本解决了“异常”问题。
相关推荐