当前位置: 首页 > article >正文

【数据库】Mysql数据库的三大范式1NF 2NF 3NF

文章目录

  • 简述
  • 1NF
  • 2NF
  • 3NF
  • 面试相关

简述

  • 1NF:字段不可拆分
  • 2NF:有主键,非主键字段依赖主键
  • 3NF:非主键字段不能互相依赖

1NF

属性不可分割,即每个属性都是不可分割的原子项(实体中的属性即表中的列)。只要字段值还可以继续拆分,就不满足第一范式。

例如:数据表中存在address地址该属性,若每条数据的值为“xx省xx市”,则该属性即可分割属性,分为“xx省”、“xx市”两个属性。

范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定,并非必须遵守该范式。

2NF

在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下。

例如某订单表为:

-- 订单表
CREATE TABLE myorder (
    product_id INT,
    customer_id INT,
    product_name VARCHAR(20),
    customer_name VARCHAR(20),
    PRIMARY KEY (product_id, customer_id)
);

product_name 只依赖于 product_idcustomer_name 只依赖于 customer_idproduct_namecustomer_id 是没有关系的,customer_nameproduct_id 也是没有关系的。

这就不满足第二范式:其他列都必须完全依赖于主键列

需要做如下改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE product (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

拆分之后,myorder 表中的 product_idcustomer_id 完全依赖于 order_id 主键,而 productcustomer 表中的其他字段又完全依赖于主键,即满足第二范式。

3NF

在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    customer_phone VARCHAR(20)
);

表中的 customer_phone 有也许依赖于 customer_id ,也就不满足第三范式:其他列之间不能有传递依赖关系

改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    phone VARCHAR(20)
);

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

面试相关

如何通俗理解三个范式?

  • 第一范式是对原子性的约束,要求属性具有原子性,不可拆分。
  • 第二范式是对记录的唯一性约束,要求具有唯一标识,即实体的唯一性
  • 第三范式是对字段冗余性的约束,即任何字段不能由其他字段派生出来

范式设计的优缺点?

  • 优点:减少数据冗余
  • 缺点:查询时需要关联多个表,更难进行索引优化

参考:
https://www.bilibili.com/video/BV1Vt411z7wy


http://www.kler.cn/a/4030.html

相关文章:

  • C++/QT环境下图像在窗口下等比例渲染绘制
  • DLNA库Platinum新增安卓64位so编译方法
  • SpringBoot错误码国际化
  • Solidity01 Solidity极简入门
  • .NET 学习:从基础到进阶的全面指南
  • 【时时三省】(C语言基础)柔性数组的使用
  • vue 高德地图添加多个点标记
  • 速度与兼容性功能大比拼:7款浏览器测评,哪一款更好用
  • 基于云计算的Java版云HIS系统源码,已在公立二甲医院应用三年
  • 云原生周刊:K8s 在 v1.27 中移除的特性和主要变更
  • 社区之声|Grant Program支持Moonbeam生态壮大
  • 物理机CPU使用率报警
  • 蓝桥杯每日一真题——[蓝桥杯 2021 省 AB2] 负载均衡(优先队列,模拟)
  • 自动指出测试问题,TestGPT来袭,测试工程师,你准备好了么
  • ShowMeAI周刊 | AI独立开发者:帆船旅行但月入万刀;创业吧!新黄金时代来了;资本看好哪些创业方向;被AI震麻的一周again
  • 线程基础知识总结
  • 18个基础命令教你轻松拿捏华为设备的各种状态!-HCIA HCIP
  • leetcode 搜索插入位置(35)
  • GPS时间序列分析---剔除跳跃点,拟合时间序列
  • 基于springboot心理健康管理系统(程序+数据库+文档)014
  • 位置编码Positional Encoding
  • 3D Slicer学习记录(6)-使用PLUSapp连接WebCam并实现marker跟踪
  • Json基本语法
  • 编程题 进制转换(Java实现)
  • Mybatis配置之别名(typeAliases)优化、设置(settings)优化、映射器(mappers)优化以及生命周期和作用域的学习和理解
  • C#,码海拾贝(02)——复数Complex计算类,《C#数值计算算法编程》源代码升级改进版