三大范式是什么?

第一范式(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",与员工信息彻底解耦。
相关推荐
露天赏雪14 分钟前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
天天被压力22 分钟前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python
GeW24 分钟前
新质生产力路线图解读:数据库性能优化与Linux调优专场
linux·数据库
天天被压力28 分钟前
【A股分钟级高频数据完全手册 #05】指数历史分钟数据接口:Pro版沪深指数分时回放
java·人工智能·python
captain37644 分钟前
▲统一功能——DispatcherServlet源码分析
java·spring·java-ee·log4j·maven
金銀銅鐵1 小时前
JDK 21 中 List.of 的实现细节:从 List12 到 ListN
java·后端·ai编程
usdoc文档预览2 小时前
USDOC系列之PPT文件在线编辑-VUE前端实现在线浏览器在线编辑PPT文档
前端·vue.js·编辑器·office365·ppt在线编辑·office文件在线编辑·文件在线编辑
在多学一点2 小时前
MYSQL第二次作业
android·数据库·mysql
用户2705077725242 小时前
Agent 调工具卡住?3 种超时与取消策略实测对比
前端
yeccheng2 小时前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试