三大范式是什么?

第一范式(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",与员工信息彻底解耦。
相关推荐
逝水无殇1 天前
HTML 文本格式化详解:掌握 <strong>、<em>、<mark>、<del> 等常用标签
前端·javascript·html
特立独行的猫a1 天前
DeepSeek Harness插件和工具的区别介绍及开发入门指南
前端·ai·agent·插件·deepseek·harness
小新讲网安1 天前
HTTP请求走私攻击实战:CL.TE与TE.CL绕过前端服务器全解析
服务器·前端·网络·web安全·http·架构·漏洞
艾莉丝努力练剑1 天前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
DB哥讲数据库1 天前
【ClickHouse安装教程】从零开始部署高性能列式数据库(附ClickHouse安装包)
数据库·clickhouse
风骏时光牛马1 天前
AI办公系统异常事件复盘分析
前端
console.log('npc')1 天前
React 19 + Vite 企业级前端项目:从零搭建到规范交付
前端·react.js·前端框架
小蒜学长1 天前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆1 天前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
光影少年1 天前
react离线缓存、图片缓存方案
开发语言·前端·javascript·react native·react.js·缓存·前端框架