大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
当你应聘后端岗位的时候,数据库的知识必不可少,今天给大家分享一下数据库三大范式的通俗理解
第一范式:无重复的列
第二范式:属性完全依赖于主键
第三范式:属性不依赖于其他非主属性
总结:
第一范式(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 |
这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的信息,也不必在订单信息表中多次输入客户信息的内容,减少了数据臃肿
数据表之间的关系
一对多关系:一个学号对应一个姓名
一对多(多对一):一个老师对应多个班级,一个班级对应多个学生
多对多:学生对应课程,用户对应商品
注意:设计数据库时,多对多关系,需要一个中间表进行关联
总结:需求>性能>范式,不用一味追求范式
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/192735.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...