数据库的三大范式及其重要性,详细易懂

目录

一.前言

[二. 三大范式](#二. 三大范式)

[2.1 第一范式(1NF)---列不可再分](#2.1 第一范式(1NF)---列不可再分)

[2.2 第二范式(2NF)---主键关系](#2.2 第二范式(2NF)---主键关系)

[2.3 第三范式(3NF)---外键关系](#2.3 第三范式(3NF)---外键关系)

三.为什么要遵循三大范式


一.前言

数据库是现代信息系统中的核心组成部分,它的设计和优化对系统的性能和数据完整性有着重要影响。在数据库设计中,三大范式是一种重要的规范,它可以帮助我们有效地组织和管理数据。本文将介绍数据库的三大范式,包括第一范式、第二范式和第三范式,并解释它们的重要性和应用场景。

二. 三大范式

2.1 第一范式(1NF)---列不可再分

第一范式是数据库设计中的基本要求,它要求每个数据表中的每个字段都是原子的,即不能再分解为更小的数据单元。这样可以避免数据冗余和数据更新异常的问题。

举例:

有以下一张表,当然这张表是不遵循第一范式的,因为列还可以再分

|----|------|-----|-------------|---------------|
| ID | name | sex | telphone | address |
| 1 | 张三 | 男 | 13155436923 | 湖南省长沙市岳麓区天顶街道 |

----问题:双十一要求查询哪个省份的纸巾买的最多??

我们是不是要根据前面的省份进行查询,如果地址是上方这样的话,我们就要进行截取,并且有些自治区等并不是前面三个字,所以就不是很方便,所以我们在淘宝等购物平台表设计是以下设计的:它会有一个地址表:

|----|----------|------|---------|------------------|
| ID | province | city | address | detailed-address |
| 1 | 湖南省 | 长沙市 | 岳麓区 | 天顶街道 |

我们在购物的时候填写地址也是先选择省份然后选择其它的,这样的表才符合数据库的第一范式

2.2 第二范式(2NF)---主键关系

第二范式要求数据表中的每个非主键字段完全依赖于主键,而不是依赖于其他非主键字段。这样可以避免数据冗余和更新异常的问题。

举例:

这个就是一个主键的约束,每一个表都有一个主键,有以下一张表

|---------|---------|-----|-------|----------|
| bid(主键) | bname | wid | press | data |
| 1 | 《中秋的起由》 | 1 | 张三出版社 | 1990-2-3 |

2.3 第三范式(3NF)---外键关系

第三范式要求数据表中的每个非主键字段都不依赖于其他非主键字段,而是直接依赖于主键。这样可以进一步减少数据冗余和更新异常的问题

举例:

第三范式,就是外键约束,比如下面两张表;

|---------|---------|---------|-------|----------|
| bid(主键) | bname | wid(外键) | press | data |
| 1 | 《中秋的起由》 | 1 | 张三出版社 | 1990-2-3 |

作者表的两个属性是依赖于作者ID而不是书籍ID

|---------|-------|-------------|
| wid(主键) | wname | wnationlity |
| 1 | 张三 | 中国 |

表设计如下

复制代码
CREATE TABLE books (
    bid INT PRIMARY KEY,
    bname VARCHAR(255),
    wid INT,
    press VARCHAR(255),
    data DATE,
    FOREIGN KEY (wid) REFERENCES authors(wid)
);

CREATE TABLE authors (
    wid INT PRIMARY KEY,
    wname VARCHAR(255),
    wnationality VARCHAR(255)
);

三.为什么要遵循三大范式

遵循三大范式有以下几个重要的原因:

  1. 数据的一致性:通过遵循三大范式,可以确保数据的一致性。数据存储在多个表中,每个表都有特定的目的和结构,这样可以避免数据冗余和不一致的问题。

  2. 数据的完整性:三大范式可以帮助我们保持数据的完整性。通过将数据分解为更小的、原子的数据单元,可以避免数据更新异常和数据丢失的问题。

  3. 数据的查询效率:遵循三大范式可以提高数据库的查询效率。通过将数据分解为多个表,可以减少数据的冗余,提高查询的速度和效率。

但是并不是所有的表,数据库都要符合三大范式,这个是根据自己的公司情况以及具体形势来决定,总之,是否符合三大范式取决于具体的业务需求和性能要求。在设计数据库时,需要根据实际情况综合考虑系统需求、性能要求、数据复杂性和系统扩展性等因素 ,并权衡范式的优劣。

相关推荐
禾小西1 小时前
Java 逐梦力扣之旅_[204. 计数质数]
java·算法·leetcode
快来卷java1 小时前
MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略
数据库·mysql·oracle
ゞ 正在缓冲99%…1 小时前
leetcode295.数据流的中位数
java·数据结构·算法·leetcode·
xy_optics3 小时前
用matlab探索卷积神经网络(Convolutional Neural Networks)-3
开发语言·matlab·cnn
有梦想的攻城狮3 小时前
spring-cloud-alibaba-nacos-config使用说明
java·spring·nacos·springcloud·配置中心
IT认证通关3 小时前
金仓数据库KCM认证考试介绍【2025年4月更新】
数据库
独好紫罗兰3 小时前
洛谷题单3-P1720 月落乌啼算钱(斐波那契数列)-python-流程图重构
开发语言·算法·leetcode
程序猿阿伟3 小时前
《SQL赋能人工智能:解锁特征工程的隐秘力量》
数据库·人工智能·sql
冰箱里的金鱼4 小时前
MYSQL 存储引擎 和 日志
数据库
慕容莞青4 小时前
MATLAB语言的进程管理
开发语言·后端·golang