第一,二,三,BC范式
范式(Normal Form)是范式是符合某一种级别的关系模式的集合。通俗一点就是对数据库中表的属性的约束条件。
第一范式 1NF
第一范式的条件:元组中的每一个分量都必须是不可分割的数据项。
反例:
学号 | 姓名 | 成绩 |
---|---|---|
平时成绩 | 期末成绩 |
应该修改为:
学号 | 姓名 | 平时成绩 | 期末成绩 |
---|---|---|---|
第二范式 2NF
第二范式的条件:在第一范式的基础上,所有的非主属性完全依赖于主键。完全依赖意味着不能依赖于主键的一部分属性。
反例:
选课信息表:
学号 | ==课程号 == | 姓名 | 性别 | 年龄 | 课程名 学分 | 成绩 |
---|---|---|---|---|---|---|
对于该表,学号和课程号组合在一起是主键,但是姓名只由学号决定,违反了第二范式。类似还有课程名由课程号决定。
所以应该拆分为:
学生表:
学号 | 姓名 | 性别 | 班级 |
---|---|---|---|
课程表:
课程号 | 课程名 | 学分 |
---|---|---|
成绩表:
学号 | 课程号 | 成绩 |
---|---|---|
第三范式 3NF
第三范式的条件:满足第二范式的基础上,非主属性都不传递依赖于主键
学生表:
学号 | 姓名 | 学校名称 | 学校地址 |
---|---|---|---|
主键是学号,但是学校地址也可以由学校名称决定,存在传递依赖分解为:
学生表:
学号 | 姓名 | 学校名称 |
---|---|---|
学校表
学校名称 | 学校地址 |
---|---|
BC范式
数据库的三大范式只是最基本的,而BC范式也常与他们放到一起讨论,因为BCNF也被称为修正的第三范式,又或者说是扩充的第三范式。
我们看到第三范式的要求是每一个非主属性都要直接依赖于主属性,看似完美,可是如果除了主属性外,还有一个候选码呢?
显然从定义可以知道,这个主属性肯定能和候选码一一对应的,那这样岂不是又会造成冗余?
觉得很抽象吗?举个例子:
仓库表:
仓库编号 | 货物编号 | 仓库管理员编号 |
---|---|---|
其中每一个仓库管理员只管理一个仓库。
那么我们可以发现这里其实主码可以有两种,分别是:
(仓库编号) 可唯一确定 (仓库管理员编号,货物编号)
(仓库管理员编号) 可唯一确定 (仓库编号,货物编号)
必须要承认上述关系是符合第三范式的,但是有没有觉得这样仓库管理员编号会出现大量的没必要的冗余啊,因此BC范式就是解决这个问题的,需要将其改为两个表,顺便可以将货物的数量加进来。
至于为什么上面关系中我不将货物数量加进来,是因为一旦加进来后那个关系就不符合第二范式了,想想看,如果加入货物数量,那么主键就变成了(仓库编号,货物编号),可是仓库管理员只与仓库编号有关,不依赖于货物编号了呀,就不构成对主键的完全依赖关系了。
下面放上BC范式的修改版:
仓库与管理员表:
仓库编号 | 仓库管理员编号 |
---|---|
仓库货物表:
仓库编号 | 货物编号 | 货物数量 |
---|---|---|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix