三大范式是什么?

第一范式(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",与员工信息彻底解耦。
相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!3 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里3 天前
java中的继承和多态的区别
java
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕3 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖3 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商