数据库设计规范之第三范式(3NF)
在之前的两篇文章数据库设计规范之第一范式(1NF) 和数据库设计规范之第二范式(2NF)中我们介绍了第一范式和第二范式。本篇我们来看一下第三范式。
通过第二范式的介绍我们知道第一范式是基础。也就是说无论是第二范式还是接下来要讲的第三范式,前提是都必须要满足第一范式。
而如果要满足第三范式除了要满足第一范式(1NF)之外,还要满足第二范式。如果不符合第二范式,自然也谈不上满足第三范式。所以要满足第三范式,需要满足以下两个条件
- 满足第二范式
- 所有非主字段都依赖于主键。
这看起来其实和第二范式没有什么区别。但是这里要注意的是,我们这里的非主字段的依赖说的是数据之间的。举个例子:我们看下面这张表,其中的 街道名称(STREET)、城市(CITY)和省份(PROVINCE)与其邮政编码的对应是固定不变的。像这种邮政编码和地址之间的依赖被称为传递依赖。
CREATE TABLE MEMBERS(
MEM_ID INT NOT NULL,
MEM_NAME VARCHAR (20) NOT NULL,
DOB DATE,
STREET VARCHAR(200),
CITY VARCHAR(100),
PROVINCE VARCHAR(100),
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (MEM_ID)
);
也就是说,现实中这一个城市中会有很多的客户,这样每个客户的记录中都会存储 街道名称(STREET)、城市(CITY)、省份(PROVINCE)和邮政编码这些固定的值。这会造成很多的冗余数据。这是不符合第三范式的。为了符合第三范式,我们需要做的就是将 STREET、CITY 、 PROVINCE 和 ZIP(邮政编码) 字段单独放到一张表中去,然后将 ZIP 作为主键。
CREATE TABLE ADDRESS(
ZIP VARCHAR(12),
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
PRIMARY KEY (ZIP)
);
接下来我们开始改造 MEMBERS 表
CREATE TABLE MEMBERS(
MEM_ID INT NOT NULL,
MEM_NAME VARCHAR (20) NOT NULL,
DOB DATE,
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (MEM_ID)
);
而此时,这张表中的 ZIP 是一个外键,引用的是表 ADDRESS中的主键ZIP。
这样最终的表就可以说是满足了第三范式了。
第二范式和第三范式的概念比较容易混淆,不过通过对比二者的例子,我们还是能找到一些区分的关键点。
对于第二范式(2NF)要检查非主键列是否完全依赖于整个主键,还是说只是依赖于主键的部分列。只要是不完全依赖于整个主键那就不符合第二范式,反之就是符合第二范式。
第三范式(3NF)是要看非主键列除开对主键的依赖,非主键之间是否有固定的依赖关系。并且这种固定的依赖关系和主键之间是不是一种多对一的关系。就像在上面例子中介绍的,地址和邮编之间的关系是固定不变的一对一的。并且主键和具有这种依赖关系的列之间是一种多对一的关系。有这种依赖关系的列就需要单独拿出来做成单独的表。一个地址中可以有多个不同的客户,客户和地址之间是一种多对一的关系。不可能出现两个不同的客户他们所在的地址一样但是邮编不一样的这种情况。因此如果出现这种情况的话,没有把具有传递依赖的列单独做成一张表就不符合第三范式,反之就是符合第三范式。
这里我们仅仅是介绍这几个范式的定义,实际项目中还要根据性能、空间等因素综合考虑来设计表。不可能就是非常严格的必须设计成符合这三种范式的表。
相关文章
MySQL 从 SQL 文件恢复数据库
发布时间:2023/05/09 浏览次数:191 分类:MySQL
-
本篇文章介绍了从 MySQL 中的 sql 文件恢复数据库。从 .sql 恢复数据库是一项简单的操作,可以使用 MySQL 工作台或命令行来实现。 本教程演示了从 SQL 文件恢复数据库的两种方法。
在 MySQL 中显示表或数据库的索引
发布时间:2023/05/09 浏览次数:107 分类:MySQL
-
本篇文章介绍了如何在 MySQL 中显示表或数据库的索引。 我们将学习如何从一个数据库或所有数据库中的一个或多个表中获取索引。
在 MySQL 中显示当前数据库
发布时间:2023/05/08 浏览次数:164 分类:MySQL
-
本篇文章重点介绍了可用于显示 MySQL 中当前数据库的各种查询。 我们将通过使用 Windows 命令行和 MySQL Workbench 来学习。
MySQL 中检查数据库是否存在
发布时间:2023/05/08 浏览次数:118 分类:MySQL
-
在本文中将介绍许多检查数据库是否存在于 MySQL 中的方法。检查数据库是否存在于 MySQL 中 系统模式是 MySQL 使用的模式。
使用 JDBC 连接到 MySQL 数据库
发布时间:2023/05/08 浏览次数:82 分类:MySQL
-
本文讨论 JDBC 以及使用 JDBC 连接数据库的要求。 我们还查看了一个示例,以了解如何实现 Java 代码来连接 MySQL 数据库。MySQL 为使用 Java 编程语言和 MySQL Connector/J 开发的应用程序提供连接。
在 MySQL 中显示表和数据库结构
发布时间:2023/04/19 浏览次数:170 分类:MySQL
-
本篇文章介绍了如何使用 mysqldump 实用程序、DESCRIBE、SHOW TABLES 和 SHOW CREATE TABLE 语句来显示 MySQL 中的表和数据库结构。
在 Windows 中备份 MySQL 数据库
发布时间:2023/04/19 浏览次数:77 分类:MySQL
-
本快速教程将讨论备份 MySQL 数据库并将其作为脚本保存在文件中。使用数据库时,建议定期备份数据库。
将密码存储在 MySQL 数据库中
发布时间:2023/04/18 浏览次数:81 分类:MySQL
-
在本指南中,您将能够了解如何在 MySQL 数据库中存储哈希密码,不同的技术及其用于存储哈希密码的具体方法。