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

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

相关推荐
小满zs5 小时前
Go语言第三章(五谷轮回)
后端·go
霸道流氓气质9 小时前
SpringBoot中通用工具类库(Utils)封装与使用实践
spring boot·后端·python
MemoleCard13 小时前
深度解析Java当中的锁机制
后端
wear工程师13 小时前
ThreadLocal 在线程池里为什么会串数据:别只会答内存泄漏
java·后端
whyfail13 小时前
前端学 Spring Boot(2):一次点击,如何穿过整个后端?
前端·spring boot·后端
程序员cxuan15 小时前
Loop 还没玩明白,Graph Engineering 又火了。
人工智能·后端·程序员
uzong16 小时前
把一面面试总结做成一个 Skill:重复的事,就别每次都重写
后端·面试
程序员海军17 小时前
一个 AI 应用开发程序员的一天,都在屏幕前忙些什么?
前端·后端·程序员
不能放弃治疗17 小时前
MCP
后端