三大范式
一、三大范式
1) 第一范式(1NF)
字段具有原子性,不可再分。所有关系型数据库系统都满足第一范式, 数据库表中的字段都是单一属性的,不可再分。例如,姓名字段,其中的姓和名必须作为一个整体,无法区分哪部分是姓,哪部分是名,
如果要区分出姓和名,必须设计成两个独立的字段。
例如:
员工ID | 姓名 | 性别 | 部门 | 联系电话 |
001 | 科尔 | 男 | 市场营销 | 10086 |
现在看这个表示没有任何问题,每个员工都只有一个ID、姓名、性别、部门但是现实生活中,每个人不只有一个联系电话,除此之外还有家庭电话,那么联系电话这个字段就是可再分的。所以这个表没有达
到第一范式。
只要我们把联系电话分为个人电话和家庭电话字段,就符合了第一范式,如下:
员工ID | 姓名 | 性别 | 部门 | 个人联系电话 | 家庭联系电话 |
001 | 科尔 | 男 | 市场营销 | 11021 | 0359-666 |
2) 第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。要求数据库表中的每个实例或行必须可以被惟一地区分。通常需要为表加上一个列,
以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键。
商品 | 供销商 | 价格 | 重量 | 分类 | 供销商电话 |
---|---|---|---|---|---|
啤酒 | 饮品1厂 | 3 | 300ml | 液体 | 18016253155 |
啤酒 | 饮品2厂 | 5 | 300ml | 液体 | 18055231233 |
可乐 | 饮品2厂 | 5 | 250ml | 液体 | 18055231233 |
需要清楚几点:
1.商品与供销商是多对多的关系
2.该表中关键字是一组组合关键字<商品,供销商>,只有商品和供销商两个字段结合才可标识出一件商品
3.存在以下部分依赖的关系
商品---->价格,重量,分类
供销商---->供销商电话
由以上存在的部分依赖关系就可知道该商品表不符合第二范式了,价格,重量,分类只依赖于商品这个主键,而供销商电话也只依赖于供销商这个主键,已经完全违背了第二范式非主键列必须完全依赖于主
键而不能只依赖于主键的一部分这一原则了。
解决方案:把上表商品表拆分为商品表和供销商表两张表,既满足了非主键字段必须完全依赖主键这一条件又减少了供销商电话重复这一冗余。
由以上存在的部分依赖关系就可知道该商品表不符合第二范式了,价格,重量,分类只依赖于商品这个主键,而供销商电话也只依赖于供销商这个主键,已经完全违背了第二范式非主键列必须完全依赖于主
键而不能只依赖于主键的一部分这一原则了。
解决方案:把上表商品表拆分为商品表和供销商表两张表,既满足了非主键字段必须完全依赖主键这一条件又减少了供销商电话重复这一冗余。
商品 | 供销商 | 价格 | 重量 | 分类 |
---|---|---|---|---|
啤酒 | 饮品1厂 | 3 | 300ml | 液体 |
啤酒 | 饮品2厂 | 5 | 300ml | 液体 |
可乐 | 饮品2厂 | 3 | 250ml | 液体 |
供销商 | 供销商电话 |
---|---|
饮品1厂 | 18016253155 |
饮品2厂 | 18055231233 |
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
所以第三范式具有如下特征:
1,每一列只有一个值
2,每一行都能区分。
3,每一个表都不包含其他表已经包含的非主关键字信息。
例如,帖子表中只能出现发帖人的id,而不能出现发帖人的id,还同时出现发帖人姓名,否则,只要出现同一发帖人id的所有记录,它们中的姓名部分都必须严格保持一致,这就是数据冗余。
这是一张学生课表:
课程编号 | 课程名字 | 上课时间 | 任课老师 | 老师电话 | 老师职位 |
---|---|---|---|---|---|
101 | 马克思理论基础 | 8:00 | Lily | 18016253155 | 讲师 |
102 | 经济学 | 14:00 | Lucy | 18055231233 | 教授 |
主键:课程编号
大致一看,上表中的非主键列确实完全是依赖于主键(课程编号)的,符合第二范式2NF。但是问题是:老师电话,老师职位直接依赖的是任课老师(非主键列),而不是直接依赖于主键,它是通过传递才
依赖于主键,所以不符合 3NF。
解决方案:依然是通过拆分,把上述学生课表拆分为课程表和教师表。
课程表:
课程编号 | 课程名字 | 上课时间 | 任课老师 |
---|---|---|---|
101 | 马克思理论基础 | 8:00 | Lily |
102 | 经济学 | 14:00 | Lucy |
教师表:
任课老师 | 老师电话 | 老师职位 |
---|---|---|
Lily | 18016253155 | 讲师 |
Lucy | 18055231233 | 教授 |
本篇文章示例数据表摘自于:CSDN (Java喵喵)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了