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

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

相关推荐
l***21781 天前
SpringBoot Maven快速上手
spring boot·后端·maven
f***14771 天前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端
计算机毕设VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
BD_Marathon1 天前
SpringBoot——多环境开发配置
java·spring boot·后端
实战项目1 天前
ASP.NET实现的房产中介管理系统设计
后端·asp.net
Victor3561 天前
Hibernate(38)如何在Hibernate中配置乐观锁?
后端
Victor3561 天前
Hibernate(37)Hibernate的多表联合查询如何实现?
后端
摸鱼的春哥1 天前
AI编排实战:用 n8n + DeepSeek + Groq 打造全自动视频洗稿流水线
前端·javascript·后端
码事漫谈1 天前
Windows异步I/O与消息循环的深度对话
后端