Access 数据表从外观上与 Excel电子表格十分相似, 而实际上, 两者有着本质上的区别。 因为, Access 数据表和 Excel 电子表格面向的对象是完全不同的。
Excel 完全面向电子表格, 它鼓励用户尽量将所有的数据都放在一个表格之中, 如果 Access 数据表也跟Excel 一样, 就会出现以下问题。
- 表不可控制地增长: 例如, 将所有的信息都包含在同一个表中,如果表中的某个字段又包含若干个属性, 这些属性又需要分别用字段表示出来, 就会使表中的字段不可控制地增长。
- 数据维护和更新困难: 如果需要对某个字段进行修改, 就需要对整个表进行搜索, 然后逐一修改。如果需要输入一条新的记录, 需要输入的字段就很多, 但是其中大部分都是重复无用的数据。
- 极大的资源浪费: 在一个表中保存所有的数据, 必定会存在大量的冗余数据, 会浪费磁盘的空间。在使用数据时, 对数据进行操作时, 也会大量浪费内存、 网络等资源。
所以, 在设计数据库中使用的表时, 需要对其进行一定的规范化处理,只有这样, 才能设计出性能优良的数据库应用程序。
在关系型数据库中, 设计数据库必须遵循一定的规则, 这些规则就是范式。 目前, 关系型数据库有 6 种范式, 分别是第一范式(1NF)、 第二范式(2NF)、 第三范式(3NF)、第四范式(4NF)、 第五范式(5NF)和第六范式(6NF)。
满足最低要求的范式称为第一范式, 在第一范式的基础上, 满足更多条件的称为第二范式, 以此类推。
虽然关系型数据库有 6 种范式,但是在实际的使用过程中, 一般只需要满足前 3 种范式就可以制作出性能优良的数据库, 所以只需要了解前 3种范式。
1.第一范式
规范化的第一个阶段为第一范式, 这是所有关系型数据库必须满足的基本条件, 具体的要求是: 表中的每一个元素只能包含一个唯一值。
1NF 包含有两层含义。第一层含义是表中的第一个字段只能包含一个属性, 即每一个字段只能有一个值。
如下图所示, 该表中的联系方式字段中包含了两个值, 就是一个不满足 1NF 的表。
![47c91005eab1737cf9c3ec994a86b563.png](https://i-blog.csdnimg.cn/blog_migrate/b32b181393f4150cedea77a2a343cd6e.jpeg)
如果要让上表满足 1NF, 解决的方法有两种。
第一种: 将联系方式字段拆分为两个字段, 如下图所示。
![ea9a48e4effb191a7213484cf2c63356.png](https://i-blog.csdnimg.cn/blog_migrate/d0727a6ee91bfd6b51de024887290a04.jpeg)
第二种: 将包含两个联系方式的记录拆分为两条记录,如下图所示。
![834d94e7c328f24b2b32cabd65e7c6b4.png](https://i-blog.csdnimg.cn/blog_migrate/3424fe8d34219f864a76d8d9308f099e.jpeg)
1NF 的第二层含义是不能有两个完全相同的字段, 如第一种的图片所示的【联系方式】 字段, 如果直接拆分为两个联系方式字段, 就不能满足要求。
2.第二范式
满足 1NF 之后的表就可以在关系数据库中使用了, 但仅满足 1NF的表还是会存在诸多问题。
例如,下图中的销售表, 由货号、 工号、 姓名、 部门、 商品名称、 销售数量、 价格和总价几个字段组成, 主键由货号和工号构成, 每一个字段都是一个完全独立的属性, 符合 1NF。
![dbc6948c6472876bd56e404a9144bd6c.png](https://i-blog.csdnimg.cn/blog_migrate/c25b94a6fe4478baa8b979c346681c9b.jpeg)
虽 然 上图的 表 格 看 似 符 合1NF, 但在使用时仍然会出现诸多问题, 简单分析一下, 可能会出现的问题有以下几个。
¬ 数据冗余: 某些员工的姓名出现了多次, 商品名称也出现了多次,导致同一种商品的价格也出现了多次。
- 更新异常: 如果需要对其中的某些数据进行更新, 则需要对整个表格进行搜索, 否则就可能出现异常。 例如, 要将洗发水的价格更改为"45", 则需要对所有销售了洗发水的员工进行查找和修改,否则就会出现一种商品对应两个价格的情况。
- 插入异常: 如果某个员工没有销售某件商品, 则销售数量为空,这个员工的信息就不能被输入到表格中。
- 删除异常: 如果某个员工的销售记录错误, 需要删除, 在删除这条记录的时候, 会将员工的基本信息一起删除。
想要避免销售表中出现这些问题, 就需要了解数据库第二个规范化的要求, 即第二范式(2NF)。
第二范式的具体内容是: 每一个非主键关键字完全依赖于主键。
根据 2NF 来分析销售表可以发现,【价格】字段完全依赖于主键【货号】 和【销售数量】, 而【姓名】【部门】 字段依赖于【工号】, 而【总价】依赖于【销售数量】 和【价格】, 所以【销售表】 并不符合 2NF。
如果想让销售表符合 2NF, 需要将其拆分为员工、 商品和各产品的销售情况这样几张表, 拆分后的效果如下图所示。
![22d40962cc67e5d892f13d56f11a389a.png](https://i-blog.csdnimg.cn/blog_migrate/b97e66d5aed629932ea48368b43ff421.jpeg)
3.第三范式
规范化的最后一步称为第三范式(3NF), 它要求移除所有可以派生自表中其他字段包含的数据的字段。
满足 2NF 的表已经是一个合格的数据表, 但是, 满足了 2NF 的表仍然可能会存在一定的问题。
如下图中的【商品信息表】中,主键为商品编码, 其余所有字段数据都依赖于商品编码。
![a94b79e94a8a99564c16bac1aa34c029.png](https://i-blog.csdnimg.cn/blog_migrate/71a1eb4be8efd24ddf7f74acc6226727.jpeg)
但是, 分析表中的字段时, 还可以发现除【分厂地址】 和【分厂电话】依赖于主键外, 其中不包含其他表中已包含的非主键字段。
所以,上图中的表并不符合3NF, 如果数据库中没有其他表, 要使该表符合 3NF, 可以将其拆分为如下图的【商品信息】 表和下图所示的【分厂信息】 表。
![82fdd2e7c31417382a68a81fcccece1d.png](https://i-blog.csdnimg.cn/blog_migrate/b85d7fdae971b09eef2eb4a9e588507a.jpeg)
![4d833f508bf07526c78fc6ae3dc77194.png](https://i-blog.csdnimg.cn/blog_migrate/d2a03fd3190d89ff725affa19311d022.jpeg)