三大范式是什么?

第一范式(1NF):原子性

核心要求:表中的每个字段都必须是不可再分的原子值。

违反示例

用户ID 姓名 联系方式
1 张三 手机:13800138000, 邮箱:zs@example.com

问题分析:"联系方式"字段包含多个信息,不具备原子性。

符合 1NF 的写法

用户ID 姓名 手机号 邮箱
1 张三 13800138000 zs@example.com

第二范式(2NF):消除部分函数依赖

前提条件

  • 已满足 1NF
  • 表必须有主键(通常是复合主键)

核心要求:所有非主属性必须完全依赖于整个主键,而不能只依赖主键的一部分。

违反示例(订单明细表)

订单ID 商品ID 商品名称 数量 单价
1001 P001 鼠标 2 50

问题分析:主键为(订单ID, 商品ID),但"商品名称""单价"只依赖于"商品ID",存在部分依赖。

符合 2NF 的写法

表1:订单明细表

订单ID 商品ID 数量
1001 P001 2
1001 P002 1
1002 P001 5
  • 主键:(订单ID, 商品ID)
  • 依赖说明:"数量"完全依赖于整个复合主键(必须同时知道是哪个订单和哪个商品,才能确定购买数量)。

表2:商品表

商品ID 商品名称 单价
P001 鼠标 50
P002 键盘 80
  • 主键:商品ID
  • 依赖说明:"商品名称"和"单价"完全依赖于单一主键"商品ID"。

第三范式(3NF):消除传递函数依赖

前提条件:已满足 2NF。

核心要求:非主属性之间不能存在依赖关系,即非主属性必须直接依赖于主键,不能通过其他非主属性间接依赖。

违反示例(员工表)

员工ID 姓名 部门ID 部门名称 部门地点
E001 李四 D10 技术部 北京

问题分析:依赖关系为 员工ID → 部门ID → 部门名称、部门地点,存在传递依赖。

符合 3NF 的写法

表1:员工表

员工ID 姓名 部门ID
E001 李四 D10
E002 王五 D20
  • 主键:员工ID
  • 依赖说明:"姓名"直接依赖于"员工ID";"部门ID"仅作为外键关联部门信息,员工表中不再存储部门的具体属性。

表2:部门表

部门ID 部门名称 部门地点
D10 技术部 北京
D20 市场部 上海
  • 主键:部门ID
  • 依赖说明:"部门名称"和"部门地点"直接依赖于"部门ID",与员工信息彻底解耦。
相关推荐
碳基硅坊15 小时前
Spring AI:把大模型接进 Spring 应用
java·人工智能·spring ai
黄毛火烧雪下15 小时前
Java 核心知识点总结(一)
java·开发语言
林希_Rachel_傻希希15 小时前
学React治好了我的焦虑症,1小时速通React 前20分钟。
前端·javascript·面试
Cache技术分享15 小时前
435. Java 日期时间 API - Clock 灵活获取当前时间
前端·后端
技术小结-李爽15 小时前
【工具】Maven的下载、安装、使用
java·maven
极创信息15 小时前
Linux挖矿病毒深度清理实战教程,从进程隐藏、Rootkit驻留到彻底根除
java·大数据·linux·运维·安全·tomcat·健康医疗
努力成为AK大王16 小时前
并发编程的核心挑战、优化方案与核心知识点总结
java·开发语言·数据库
云烟成雨TD16 小时前
Agent Scope Java 2.x 系列【10】技能(Skill)
java·人工智能·agent
摇滚侠16 小时前
SpringMVC 入门到实战 DispatcherServlet 源码解读 92-95
java·后端·spring·maven·intellij-idea
键盘歌唱家16 小时前
Spring AI 入门分享:它和“直接调 API“到底差在哪
java·人工智能·spring