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 “培训员工信息”表拆分结果