问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

数据库设计三大范式:让数据库结构更规范

创作时间:
作者:
@小白创作中心

数据库设计三大范式:让数据库结构更规范

引用
CSDN
1.
https://m.blog.csdn.net/qq_66848092/article/details/144274455

数据库设计的规范化是构建高效、稳定且易于维护的数据库系统的关键。本文将详细介绍数据库设计的三大范式(1NF、2NF、3NF),并通过实例说明如何应用这些范式。

一、 数据库设计流程

数据库设计通常遵循以下流程:

  1. 现实世界的实体模型通过建模转换为信息世界的概念模型(即E-R模型)
  2. 概念模型经过模型转化,得到数据库世界使用的数据模型(在关系数据库设计中为关系模型)
  3. 数据模型进一步规范化,得到数据库结构模型

二、 数据库设计规范化

数据库规范化设计的重要性

数据库规范化设计是确保数据库结构高效、准确和一致性的重要过程。它通过减少数据冗余、避免更新异常、插入异常和删除异常,提高数据的完整性和可靠性。规范化设计将数据组织成更小的、更专业化的表,这些表通过关系相互连接,使得数据查询和操作更加灵活和高效。此外,它还简化了数据库的维护工作,降低了数据冗余带来的存储和管理成本。

第一范式(1st NF)

要求:第一范式的目标是确保每列的原子性

如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)。

下面来解释一下第一范式到底是什么,以上对于第一范式的定义,简单来说就是指表中的每一个字段必须是不可拆分的最小单元。或许这样说还有点抽象,什么是字段不可拆分的最小单元?那我们下面一起来看一张表:

从上表中我们可以看到,表中的Address字段就是很明显的可再拆分字段,因为表中的地址信息是可以继续分割的。如果想要满足第一范式的要求,那就必须将Address这个字段拆分成Country(国家)字段和Address(城市)字段。如下图所示:

总的来说,数据库设计第一范式(1NF)是关系型数据库设计的基础规范,要求数据库表中的每个字段都是原子性的,即不可再分的最小数据单元。它确保每一列的数据都是单一的、不可分割的值,避免了数据冗余和复杂性,为后续的数据库设计范式奠定了基础。满足第一范式能够提升数据的一致性和查询效率。

第二范式(2nd NF)

如果一个关系满足1NF,并且出任何一个非主键字段的数值都依赖于主键字段,则满足第二范式(2NF)

第二范式要求每个表只描述一件事情

显而易见,第二范式要求每个表中的所有非主键字段都必须依赖于主键字段,而且要求所有字段都描述的是同一件事情或者同一个功能,看下面这张表就知道了,先看看它是否符合第二范式的要求呢?

很显然,表中的非主键 “学分” 字段完全依赖于另一个非主键 “课程名称” 字段,也就是说,每一门课程能修多少的学分是由课程来决定的,而不是由主键( “学号” 字段)来决定的,也就是说学分并不应该是选课关系表中。所以,我们必须将 “选课关系表” 中的 “学分” 字段删除,如果一定需要 “学分” 字段的话,可以再数据库中另外建立一个 “课程表” 用来管理课程名称和学分之间的关系。这就是数据库设计第二范式要求的数据库字段统一性的体现。

下面我们再来看以下这张表:

很明显,不用我说都能知道,首先 “产品规格” 字段并不属于主键 “订单编号” 字段,其次,这个表并不是统一的,也就是这个表并不只描述一件事情。上表中描述的是两件事情,也就是订单和产品在这个表中都包括了,所以最好要将这个表分成两个表,如下图所示:

一个表交Orders表只描述订单,还有一个表叫Products表,只描述商品,将这两个表拆分出来,然后再添加一个订单明细表,将这两个表关联起来即可。

第三范式(3rd NF)

若一个关系满足第一范式(1NF)和第二范式(2NF),任何两个非主键字段的数值之间不存在函数依赖关系则满足第三范式(3NF)

很明显,这条规范就是要求你在设计数据库的时候,各个字段不能存在运算关系,我们一起来看一下以下这张表就明白了:

在上表中,“金额” 字段明显是通过 “单价” 字段和 “数量” 字段计算得来的,即单价 * 数量 = 金额。所以这个表并不符合第三范式,应该去掉 “金额” 字段才可以。

如果你要问,那如果功能中需要计算总价,也就是金额该怎么办呢?这种情况下,我们也不能在数据库中添加 “金额” 字段,而是应该通过将数据查出来之后,使用代码去计算它们的金额,这样才能既满足第三范式的要求,又能实现功能的要求。

练习:

学习了三大范式之后,你可以通过以下这个例子来看看是否真正掌握了三大范式的要领。下面是两个同学设计的数据库,请你看看谁的更合适呢?

闲话少说,应该是B同学的设计更好一些,举个例子:

很显然,先来看A同学的设计结果:

A:6(字段) 5000(同学) 10(课程)=300000(个数据)**

按照A同学的设计来看的话,记录5000个同学的10门成绩就要产生30万条数据

B:学生表:3(字段)* 5000(学生)= 15000(个数据)

课程表:2(字段)* 10(课程) = 20(个数据)

成绩表:3(字段)* 10(课程)* 5000(学生) = 150000(个数据)

** 数据总计:15000 + 20 + 150000 = 165020 (个数据)**

所以很明显,A与B方案数据差了300000 - 165020 = 134980(个数据),所以由此可见数据库设计对于现实中的应用有多重要,只是因为设计上的不同,就多产生了比其他方案多了将近一倍的数据,这不仅会加重数据库和服务器的压力,而且也不方便进行管理。

总结:

数据库设计三大范式(1NF、2NF、3NF)的重要性在于确保数据的高效、稳定和易于维护。第一范式要求每个字段都是原子的,避免数据冗余;第二范式要求每个非主键字段完全依赖于主键,提高数据一致性;第三范式要求非主键字段不依赖于其他非主键字段,进一步减少冗余,提升查询效率。三大范式共同构建了高效、稳定且易于维护的数据结构,是数据库设计的基石。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号