社区编辑申请
注册/登录
面试突击:什么是三范式?它有什么用?
开发 前端
第一范式规定表中的每个列都应该是不可分割的最小单元。第二范式是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部分依赖。第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。


作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

一、第一范式

第一范式规定表中的每个列都应该是不可分割的最小单元。比如以下表中的 address 字段就不是不可分割的最小单元,如下图所示:

其中 address 还可以拆分为国家和城市,如下图所示:


图片

这样改造之后,上面的表就满足第一范式了。

二、第二范式

第二范式是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部分依赖,也就是说每张表只描述一件事情,比如以下订单表就不满足第二范式,它可以拆分为两张独立的表:订单表和商品表。

1、不满足第二范式的订单表

PS:上面的表可拆分为两张独立的表:订单表和商品表。

2、 满足第二范式的表

订单表:

商品表:

三、第三范式

第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。比如以下的订单表中的顾客名称就不符合第三范式,因为它存在了对非主键顾客编号的依赖,如下图所示:

修改之后(符合第三范式)的表结构如下:

总结

第一范式规定表中的每个列都应该是不可分割的最小单元。第二范式是在满足第一范式的基础上,规定表中的非主键列不存在对主键的部分依赖。第三范式是在满足第一范式和第二范式的基础上,规定表中的列不存在对非主键列的传递依赖。使用数据库三范式的优势是:表的结构更简单、优雅,表的逻辑和条理性更强,并且使用三范式可以很大程度的减少表中的冗余数据,很好的节省了数据库的存储资源。

责任编辑:姜华 来源: Java面试真题解析

同话题下的热门内容

Java 服务 Docker 容器化优秀实践程序员不得不知道的 API 接口常识TestOps完全手册:工作流、生命周期、团队和流程11个 ES2022(ES13)中惊人的 JavaScript 新特性不要在 Python 中使用循环,这些方法其实更棒!使用 Vite 和 TypeScript 带你从零打造一个属于自己的 Vue3 组件库你需要知道的TypeScript高级类型Hooks时代,如何写出高质量的react和vue组件?

编辑推荐

太厉害了,终于有人能把TCP/IP协议讲的明明白白了!牛人5次面试腾讯不成功的经验HBase原理–所有Region切分的细节都在这里了Javascript如何监听页面刷新和关闭事件如何搭建一个HTTPS服务端
我收藏的内容
点赞
收藏

51CTO技术栈公众号