数据库设计规范之第二范式(2NF)
第二范式的前提要求是必须要满足第一范式,在满足第一范式的基础上又增加了两个内容。一是每张表必须要有主键,这一点和在第一范式那一篇的最后将其作为了第一范式的最后一条规则;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
关于第一范式可以查看上一篇文章数据库设计规范之第一范式(1NF)
这要怎么理解呢,我们还是通过一个例子来试图分析它。
我们有一张 客户-订单 关系表。我们想存储客户的ID,客户姓名、订单 ID 和订单详细信息以及购买日期。结构如下:
CREATE TABLE MEMBERS(
MEM_ID INT NOT NULL,
MEM_NAME VARCHAR (20) NOT NULL,
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (MEM_ID, ORDER_ID)
);
该表满足第一范式;因为它遵守第一范式的所有规则。PRIMARY KEY (MEM_ID, ORDER_ID)
定义了该表的主键由 MEM_ID 和 ORDER_ID 组成。假设同一个客户不会订购相同的东西,那么这二者就可以标识唯一的一条记录。
但是,该表不满足第二范式,因为存在主键和列的部分依赖关系。MEM_NAME 依赖于 MEM_ID,并且客户的姓名和他购买的东西之间没有真正的联系。订单详细信息和购买日期也取决于 ORDER_ID,但它们不取决于 MEM_ID,因为 MEM_ID 与 ORDER_DETAIL和 SALE_DATE 之间也没有必然的联系。
为了使这张表符合第二范式,需要将相关的列分成三个表。
首先,创建一个表来存储客户详细信息。
CREATE TABLE MEMBERS(
MEM_ID INT NOT NULL,
MEM_NAME VARCHAR (20) NOT NULL,
PRIMARY KEY (MEM_ID)
);
然后是创建一个表来存储每个订单的详细信息。
CREATE TABLE ORDERS(
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
PRIMARY KEY (ORDER_ID)
);
最后是将二者的对应关系单独存到一张表里,用各自表的主键作为该表的外键进行关联。然后加上SALE_DATE 来表示该客户下单的时间。如下:
CREATE TABLE MEMBERORDERS(
MEM_ID INT NOT NULL,
ORDER_ID INT NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);
综上三张表满足了第二范式(2NF)。当然它肯定也是满足第一范式的。
总结
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。
在接下来的 数据库设计规范之第三范式 的介绍中,我们会看到第三范式和第二范式很像,容易混淆。但是仔细对比例子还是能找出区分的关键点。
相关文章
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 数据库中存储哈希密码,不同的技术及其用于存储哈希密码的具体方法。