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

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

相关推荐
AI老猿博士2 分钟前
SpringBoot自动配置揭秘
后端
程序员爱钓鱼4 分钟前
Go for 循环详解
后端·面试·go
程序员爱钓鱼4 分钟前
Rust impl详解:为Struct定义方法与关联函数
前端·后端·rust
weixin_4316004412 分钟前
NestJS 入门(9):连上数据库,SQL 写在哪?
数据库·后端·sql·学习·nest.js
qq_225891746626 分钟前
基于Flask的城市地铁客流量数据预测系统设计与实现
后端·python·flask
IT_陈寒29 分钟前
搞不定JavaScript的数组去重?你可能漏了这两个坑
前端·人工智能·后端
AINative软件工程1 小时前
AI Agent 证据仲裁工程实践:别让检索结果按自信程度撒谎
人工智能·后端·ai编程
卷无止境2 小时前
FastAPI 权限管理实战:从 ACL 到 RBAC 的那些门道
后端·python·fastapi
GreenTea10 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
风流 少年10 小时前
Spring AI 2.0:Memory
java·后端·spring