首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >数据库的三大范式[通俗易懂]

数据库的三大范式[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-30 16:41:50
发布2022-09-30 16:41:50
12.5K1
举报

大家好,又见面了,我是你们的朋友全栈君。

当你应聘后端岗位的时候,数据库的知识必不可少,今天给大家分享一下数据库三大范式的通俗理解

第一范式:无重复的列

第二范式:属性完全依赖于主键

第三范式:属性不依赖于其他非主属性

总结:

第一范式(1NF)

原子性:保证数据不可再分

第二范式(2NF)

前提:满足第一范式

每张表只描述一件事情,就是主键对应着所有信息

第三范式(3NF)

前提:满足第一和第二范式

第三范式需要保证表中的数据和主键直接相关,而不是间接相关

注意:

阿里巴巴要求 关联查询的表不得超过3张,数据库的性能更加重要,适当考虑规范性就好

其实目前关系数据库有六种范式:

第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯-科德范式(BCNF),第四范式(4NF),第五范式(5NF,又称完美范式)

目前我们用的最多的就是第一范式(1NF),第二范式(2NF),第三范式(3NF)

第一范式:要求数据库的每一列都是不可分割的原子项

举个例子:

表中 家庭信息 和 学校信息 列都不满足原子性的要求,即不满足第一范式

将第一张图片进行调整,调整后的每一列都是不可再分的,即满足第一范式(1NF)

第二范式(2NF):在第一范式的基础上,非主键属性必须依赖于主键属性

第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合键)

如上图所示,同一个订单中可能包含不同的产品,所以主键必须是订单号和产品号联合组成

但是,产品数量、产品折扣、产品价格与“订单号”和“产品号”都相关,但是订单金额和订单时间仅与“订单号”相关,与“产品号”无关,

第三范式(3NF):在满足第二范式的基础上,保证每列都和主键列直接相关,而不是间接相关

比如在设计一个订单数据表时,可以将客户编号作为一个外键和订单表建立相应的关系,而不可以在订单表中添加关于客户其他信息(如姓名,电话等)的字段。如下图表就是一个满足第三范式的数据库表

订单编号

订单项目

负责人

业务员

订单数量

客户编号

001

冰箱

小明

张三

2台

1

002

洗衣机

小红

李四

8台

2

003

油烟机

小青

王五

7台

3

客户编号

客户名称

客户住址

联系方式

1

张明

翻斗花园

15437897758

2

陈启

五一广场

13286579908

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的信息,也不必在订单信息表中多次输入客户信息的内容,减少了数据臃肿

数据表之间的关系

一对多关系:一个学号对应一个姓名

一对多(多对一):一个老师对应多个班级,一个班级对应多个学生

多对多:学生对应课程,用户对应商品

注意:设计数据库时,多对多关系,需要一个中间表进行关联

总结:需求>性能>范式,不用一味追求范式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192735.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月16日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档