三大范式是什么?

第一范式(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",与员工信息彻底解耦。
相关推荐
李伟_Li慢慢12 小时前
URDFLoader简介
前端·机器人·three.js
pursuit_csdn12 小时前
力扣周赛 503
java·算法·leetcode
青山如墨雨如画12 小时前
【Win11下的andrej-karpathy-skills 配置指南】22 万 Star 的极简项目,如何治好 AI 的「过度设计」
前端
ljt272496066112 小时前
Vue笔记(五)--组件进阶
前端·vue.js·笔记
步十人12 小时前
【MySQL】进阶01-存储引擎
数据库·mysql
Chase_______12 小时前
【Java】String 常量池、== 与 equals 详解:从引用比较到 intern() 一次讲清
java·开发语言
专注VB编程开发20年12 小时前
B4A要编绎成Release发布APP/waiting for ide debugger to connect
java·b4a
我欲扶摇九万里12 小时前
Mac版idea快捷键失效的原因及解决方法
java·macos·intellij-idea
拙野12 小时前
【保姆级教程】Claude Code无缝集成DeepSeek V4 Pro
java·人工智能·deepseek·claudecode·ai coding