4.1 什么样的表才规范

对数据库中使用的表进行一定的规范,可以提高表的性能

虽然Access中的表与Excel中的表十分相似,但是它们有着本质上的区别。这主要是因为它们面向的对象是完全不同的。

Excel是完全面向电子表格的,它鼓励用户将所有的数据都放在一个表格之中,但是如果在Access的数据表中也这样存储数据,就会出现十分严重的问题。

♦ 表不可控制地增长:由于将所有的信息都包含在同一个表中,如果表中的某个字段又包含若干个属性(这些属性当然也需要分别用字段表示出来),就会使得表中的字段不可控制地增长。

♦ 数据维护和更新困难:如果需要对某个字段进行简单修改,就需要对整个表进行搜索,然后逐一进行修改;如果需要输入一条新的记录,需要录入的字段就很多,但是其中大部分都是重复无用的数据。

♦ 极大的资源浪费:在一个表中保存所有的数据,其中必然存在着大量的冗余数据,这极大地浪费了磁盘的空间;在使用数据时,需要进行的操作也会大量地浪费内存、网络等资源。

鉴于此,在设计数据库中使用的表的时候,就需要对其进行一定的规范化处理,只有这样,才可能设计出性能优良的数据库应用程序。

在关系型数据库中,构造数据库必须遵循一定的规则,这些规则就是范式。目前,关系型数据库的有6种范式,分别为第一范式(1NF)、第二范式(2NF)、……、第六范式(6NF)。

满足最低要求的范式称为第一范式(1NF),在第一范式(1NF)的基础上满足更多条件的范式称为第二范式(2NF),依此类推。

虽然关系型数据库有6种范式,但是在实际使用的过程中,一般只需要满足前3种范式就可以制作出性能优良的数据库表了。

4.1.1 第一范式

规范化的第一个阶段为第一范式(1NF),它是所有的关系型数据库必须满足的基本条件。其具体的内容为:

表中的每一个元素只能够包含一个唯一值。

1NF包含有两层含义,第一层含义是表中的每一个字段只能包含一个属性(即每一个字段只能够有1个值),如图4-1所示即为一个不满足1NF的表,该表中“联系方式”字段中部分包含有两个值。

图4-1 不满足1NF的表

对于图4-1中的表,如果想要使其满足1NF,有两种方法可供选择:一种是将“联系方式”字段拆分为两个字段,如图4-2所示;另一种是将包含两个联系方式的记录拆分为两条记录,如图4-3所示(这都是针对不增加表的情况)。

图4-2 拆分为两个字段使表满足1NF

图4-3 拆分为两条记录使表满足1NF

1NF的另一层含义是不能有两个完全相同的字段,如图4-1的“联系方式”字段,就不能直接拆分为两个“联系方式”字段。

4.1.2 第二范式

满足1NF之后的表就可以在关系数据库中使用了,但是并不是说满足1NF的表就没有问题了。1NF只是关系数据库中表的基本条件,如果希望表的性能尽可能的优秀,还需要满足一些其他的条件。

如图4-4所示的“选课关系”表,该表由学号、课程号、姓名、年龄、成绩、课程名和学分这7个字段组成,主键由学号和课程号构成,每一个字段都是一个完全独立的属性,符合1NF。

图4-4 符合1NF但是存在问题的表

虽然图4-4所示的“选课关系”表符合1NF,但是在使用的时候还是容易出现问题,其中出现的问题可以分为以下几个方面。

♦ 数据冗余:张三选择了两门课程,他的信息(年龄、姓名)就出现了两次;高等数学这门课程被选择了两次,这门课程的学分也就出现了两次。

♦ 更新异常:如果需要对其中的某些数据进行更新,则需要对整个表进行搜索,否则就可能出现异常。比如,将高等数学的学分更改为5.5分,则需要对所有选择了高等数学这门课程的记录的学分进行修改,否则就会出现一门课程对应两个学分的情况。

♦ 插入异常:如果某个学生没有选择课程,则课程号为空,这个学生的信息也就不能够插入到表中。对于课程也是一样,如果某门课程没有被选择,该课程的基本信息也就不能够插入。

♦ 删除异常:如果某个学生需要退选某门课程,在删除这条记录的时候,会连该学生的基本信息一起删除。

如果想要知道“选课关系”表出现这些问题的原因,就需要了解数据库的第二个规范化要求——第二范式(2NF),其具体的内容如下所示:

每一个非主键关键字完全依赖于主键(是主键全体,不是主键的一部分)。

根据2NF来分析“选课关系”表,可以发现只有“成绩”字段完全依赖于主键(学号,课程号),而姓名、年龄字段只依赖于学号(复合主键的一部分),课程名、学分也只依赖于课程号,即“选课关系”表不符合2NF。

要使“选课关系”表符合2NF,需要将其拆分为学生、课程和选课关系等3张表,拆分后的表的效果如图4-5所示。

图4-5 将不符合2NF的表拆分为多个表

4.1.3 第三范式

满足2NF的表已经是一个合格的表了,但是,满足了2NF的表依然可能存在问题,如图4-6所示。

图4-6 符合2NF但存在冗余的情况

图4-6所示的“培训员工信息”表中,主键为“员工编号”字段,其余的所有字段都完全依赖于员工编号(即根据任意给定的员工编号,就可以找到唯一的其他字段的值)。

但是,分析表中的字段,还可以发现分厂地址、分厂联系电话除了依赖于主键外,还依赖于另一个非主键字段所属分厂,这样的依赖方式称之为传递依赖。

数据库的第三范式(3NF)要求数据库表中的数据不存在传递依赖,或者说数据库表中不包含其他表中已经包含的非主键字段。

很明显,图4-6所示的“培训员工信息”表不符合3NF。假设数据库中没有其他的表,则要使该表符合3NF,需要将该表拆分为两个表,如图4-7所示。

图4-7 “培训员工信息”表拆分结果