1.4.2 数据库的规范化设计规则

重复和冗余的信息会浪费计算机磁盘空间并影响任务的执行效率,在修改信息时还很容易出现遗漏和不统一的问题,因此良好的数据库设计应该避免数据的重复和冗余,并确保信息的正确和完整,同时还要满足数据处理和报表需求。

在设计Access数据库时有一套需要遵循的设计规则,遵循这些规则可以将数据正确划分到多个表中,并确保表结构设计的正确性,将这些规则应用到数据库设计的过程称为数据库的规范化或标准化。

数据库的规范化主要包括3个阶段,按照执行它们的先后顺序,依次将这3个阶段称为第一范式,第二范式和第三范式。

1.第一范式

第一范式是指表中的每个值都只包含单独的一项,而不能包含多项。

在1.1.3节曾介绍过“值”的含义,它是指表中行(记录)和列(字段)交叉位置上的内容,即表中每个单元格中的内容。

如图1-39所示,表中的“商品名称”列中的每一项都包含由逗号分隔的两项内容,因此该列中的数据组织方式违反了第一范式的要求。

图1-39 不符合第一范式的表

如图1-40所示为整理后的符合第一范式的表,将商品名称和数量分别放置到两列中,由于每个订单中包含两种商品,因此拆分后会出现相同的订单编号,每条订单记录中只包含一种商品。

图1-40 符合第一范式的表

2.第二范式

第二范式是指表中的字段必须完全依赖该表的主键,不完全依赖主键的其他字段应该被划分到其他表中。

第二范式要求将一个大表划分为信息相对独立的多个小表,每个表只涉及一个实体或主题。如图1-40所示,“订单编号”字段是表的主键,表中的商品名称并不完全依赖订单编号,因为同一种商品可以出现在不同的订单编号中,因此应该将“商品名称”字段从该表中删除,并将其划分到其他表中。

修改后得到两个表,如图1-41所示,一个表是删除“商品名称”和“数量”两个字段后的表,此时的订单编号和客户名称不再包含重复值;另一个表是包含“商品名称”“数量”“订单编号”的表,由于一个订单中包含多个商品,因此该表中的订单编号会重复。由于两个表都包含“订单编号”字段,因此可以通过为它们设置关系来建立两个表数据之间的关联。

图1-41 符合第二范式的表

提示:实际上在上面这个示例中,包含商品名称的表中仍然有重复出现的订单编号。解决这个问题的方法是创建第三个表,并将该表作为前两个表的联接表,将原来两个表之间的“多对多”关系转换为三个表之间的两个“一对多”关系。创建表关系的相关内容将在第5章进行介绍。

3.第三范式

第三范式是指表中的各个字段之间相对独立,彼此之间没有内在的关联。

例如,在一个包含商品单价、购买数量和总价的表中,总价通过单价乘以购买数量计算得到。如果修改单价或购买数量,总价会随之改变,因此表中的“总价”字段违反了第三范式的要求,要将该字段从表中删除,可以通过计算字段的方式进行添加。