【面试小姿势】数据库设计的三大范式及其应用

面试ing~

面试官:数据库中,在创建表时需要注意什么? 我:需要合理的创建索引和使用索引,balabala,开始吟唱... 面试官:除了索引呢? 我:在创建字段时,应注意字段合理使用char和varchar定义,需要满足三大范式(好久没看,没忽悠住面试官) 给自己挖了大坑...

现在来填补一下这个大坑!

第一范式(1NF)

第一范式要求数据库表中的每个字段都是原子性的,不可再分。换句话说,就是每个字段中不能包含多个值或重复的数据。此外,每个表必须具有唯一的标识符(主键),用来唯一地标识每一行。

比方说我们现在有一个存储顾客订单的数据库表,如果我们将顾客姓名和联系方式拆分成多个字段,就违反了第一范式。合理的做法是将每个顾客的信息存储为一行,并且为每一行添加一个唯一的标识符。

sql 复制代码
-- 错误定义(违反第一范式)
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerFirstName VARCHAR(50),
    CustomerLastName VARCHAR(50),
    CustomerPhone VARCHAR(20)
)

-- 正确定义
CREATE TABLE Orders (
    OrderId INT PRIMARY KEY,
    CustomerName VARCHAR(100),
    CustomerPhone VARCHAR(20)
)

第二范式(2NF)

第二范式要求数据库表中的非主键字段完全依赖于主键,而不是依赖于主键的一部分。换句话说,如果某个字段与主键只有部分依赖关系,就需要将其拆分到另一个表中。

比如,我们有一个订单表,订单表包含的字段如下:

这个表格中的字段就违反了第二范式,因为"类别"字段只与"产品"字段相关,而与主键"订单号"无关。我们把它拆分为两个表格就对了,如下所示:

订单表:

产品表:

第三范式(3NF)

第三范式要求数据库表中的非主键字段之间没有传递依赖关系。换句话说,如果一个字段可以通过其他非主键字段推导出来,就需要将其拆分到另一个表中。

以一个学生表为例,现在有以下字段,是不符合数据库第三范式的:

因为"教师"字段依赖于"课程"字段,而非主键"学号"。需要将它拆分为三个表格:

学生表:

课程表:

成绩表:

这样分表才符合数据库的第三大范式!.

小结

数据库的三大范式(1NF、2NF和3NF)给我们提供了一套指导原则,帮助我们用于设计高效、规范的关系型数据库。

第一范式确保每个字段都是原子性的,每个表具有唯一标识符;第二范式消除了非主键字段对主键的部分依赖;第三范式消除了非主键字段之间的传递依赖。

遵循数据库的范式的优点:

可以帮助我们设计出更加规范、高效的数据库结构,减少数据冗余、提高数据一致性,并减少数据更新异常的风险。

But,根据具体的业务需求,在某些情况下可能需要权衡范式的规则来满足特定的性能或灵活性需求。所以在数据库设计中,根据实际情况选择合适的范式还是非常重要滴~~~。

相关推荐
鹏程十八少5 小时前
Android TransactionTooLargeException 的真相与修复:从 1.13MB Bundle 到 Binder 内核的完整剖析
前端·后端·面试
geovindu5 小时前
go: Monitor Pattern
开发语言·后端·设计模式·golang·监控模式
ZHOUPUYU5 小时前
PHP 开发实战:从零搭建一个高性能的 RESTful API 服务
运维·开发语言·后端·html·php
身如柳絮随风扬5 小时前
除了 JWT,你还用过哪些认证方案?Spring Security 中如何集成 JWT?
java·后端·spring
techdashen5 小时前
Rust 能帮你捕获什么,又不能捕获什么
开发语言·后端·rust
YOU OU5 小时前
Spring MVC 练习项目
java·后端·spring
Spider Cat 蜘蛛猫15 小时前
Springboot SSO系统设计文档
java·spring boot·后端
zyk_computer16 小时前
AI 时代,或许 Rust 比 Python 更合适
人工智能·后端·python·ai·rust·ai编程·vibe coding
雨辰AI16 小时前
SpringBoot3 项目国产化改造完整流程|从 MySQL 到人大金仓落地
java·数据库·后端·mysql·政务
GreenTea18 小时前
【Rust 2026教程:从零构建 Mini-OLAP 引擎】第 6 章 Benchmark 与优化路线图
后端