Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

  • MySQL 类

    • MySQL 为什么一定要有一个主键
    • MySQL 中的 RR 隔离级别,到底有没有解决幻读问题
    • MySQL 的行级锁到底锁的是什么东西?
    • 存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    • 数据库的三范式是什么?
      • 说说 InnoDB 与 MyISAM 的区别
      • drop、truncate、delete 的区别
      • 聊一聊数据库事务机制
      • 聊一聊 MySQL 中的关联查询
      • 事务隔离级别有哪些?MySQL 的默认隔离级别是什么
      • 分库分表之后,id 主键如何处理?
      • 说说在 MySQL 中一条查询 SQL 是如何执行的?
      • 讲解下 DDL、DML、DCL
      • 存储过程和触发器的作用
      • MySQL 如何行转列和列转行
      • 如何查看 SQL 的执行计划
      • union 和 unionAll 的区别
      • having 和 where 的区别
      • 常见的索引原则
      • MySQL 中的 IN 和 EXISTS 子句有什么区别?
      • MySQL 如何处理 NULL 值,对性能有什么影响?
      • 如何在 MySQL 中处理和避免全表扫描?
      • MySQL 中的表空间是什么,它的作用是什么?
      • 在 MySQL 中,如何优化 ORDER BY 查询?
    • Java 8 + 特性类

    • 其他技术类

    • 常见面试题
    • MySQL 类
    刘博
    2025-12-29
    目录

    数据库的三范式是什么?

    数据库三范式(Normal Form,NF)是 “关系型数据库设计的规范”,目的是 “减少数据冗余、避免更新异常(插入 / 删除 / 修改异常)、保证数据一致性”,三范式的要求逐级严格,具体定义如下:

    # 1. 第一范式(1NF,First Normal Form):原子性

    • 定义:表中的每一列(属性)必须是 “原子值”(不可再分的数据项),即列不能包含多个值或复合数据(如 “地址” 列不能同时存储 “省、市、区”,需拆分为 “省份”“城市”“区县” 三列);

    • 示例(不满足 1NF):

      用户 ID 姓名 联系方式(不满足原子性)
      1 张三 13800138000,zhangsan@xxx.com (opens new window)
    • 示例(满足 1NF):

      用户 ID 姓名 手机号 邮箱
      1 张三 13800138000 zhangsan@xxx.com
    • 核心要求:列不可再分,确保数据的最小存储单元。

    # 2. 第二范式(2NF,Second Normal Form):完全函数依赖

    • 前提:满足第一范式;

    • 定义:表中的每一列(非主键列)必须 “完全函数依赖” 于主键(或主键组合),即非主键列不能依赖于主键的一部分(避免 “部分函数依赖”);

    • 关键概念:

      • 函数依赖:若通过主键的值可唯一确定某列的值,称该列依赖于主键(如 “用户 ID” 可确定 “姓名”,即 “姓名” 依赖于 “用户 ID”);
      • 部分函数依赖:若主键是组合主键(如 “订单 ID + 商品 ID”),非主键列仅依赖于组合主键的一部分(如 “商品名称” 仅依赖于 “商品 ID”,与 “订单 ID” 无关);
    • 示例(不满足 2NF):

    主键为 “订单 ID + 商品 ID” 的订单表:

    订单 ID 商品 ID 订单日期(依赖订单 ID) 商品名称(依赖商品 ID)
    1001 2001 2024-01-01 手机
    • 问题:“订单日期” 依赖于 “订单 ID”(主键的一部分),“商品名称” 依赖于 “商品 ID”(主键的一部分),存在部分函数依赖;

    • 示例(满足 2NF):

      1. 拆分订单表(主键:订单 ID):

        | 订单 ID | 订单日期 | | ------- | ---------- | | 1001 | 2024-01-01 |

      2. 拆分订单项表(主键:订单 ID + 商品 ID):

        | 订单 ID | 商品 ID | | ------- | ------- | | 1001 | 2001 |

      3. 拆分商品表(主键:商品 ID):

        | 商品 ID | 商品名称 | | ------- | -------- | | 2001 | 手机 |

    • 核心要求:非主键列必须依赖于完整的主键,避免部分依赖。

    # 3. 第三范式(3NF,Third Normal Form):传递函数依赖

    • 前提:满足第二范式;

    • 定义:表中的每一列(非主键列)必须 “直接依赖” 于主键,不能 “传递依赖” 于主键(即非主键列不能依赖于其他非主键列);

    • 关键概念:

      • 传递函数依赖:若 A 依赖于主键,B 依赖于 A,则 B 传递依赖于主键(如 “用户 ID” 是主键,“部门 ID” 依赖于 “用户 ID”,“部门名称” 依赖于 “部门 ID”,则 “部门名称” 传递依赖于 “用户 ID”);
    • 示例(不满足 3NF):

    主键为 “用户 ID” 的用户表:

    用户 ID 姓名 部门 ID 部门名称(依赖部门 ID)
    1 张三 3001 技术部
    • 问题:“部门名称” 依赖于 “部门 ID”(非主键列),“部门 ID” 依赖于 “用户 ID”(主键),因此 “部门名称” 传递依赖于 “用户 ID”;

    • 示例(满足 3NF):

      1. 拆分用户表(主键:用户 ID):

        | 用户 ID | 姓名 | 部门 ID | | ------- | ---- | ------- | | 1 | 张三 | 3001 |

      2. 拆分部门表(主键:部门 ID):

        | 部门 ID | 部门名称 | | ------- | -------- | | 3001 | 技术部 |

    • 核心要求:非主键列之间不能存在依赖关系,避免传递依赖。

    # 4. 三范式的核心目标与权衡

    • 核心目标:减少数据冗余(如 “部门名称” 无需在用户表中重复存储)、避免更新异常(如修改 “部门名称” 时,仅需修改部门表,无需修改用户表);
    • 权衡:过度规范化(如拆分过多表)会导致多表关联查询(如查询用户信息需关联用户表和部门表),增加查询复杂度和性能开销;因此,实际设计中可能 “反范式”(如为提升查询效率,在用户表中冗余 “部门名称”),需在 “冗余” 和 “性能” 之间平衡。

    上次更新: 12/30/2025
    存储 MD5 值应该用 VARCHAR 还是用 CHAR?
    说说 InnoDB 与 MyISAM 的区别

    ← 存储 MD5 值应该用 VARCHAR 还是用 CHAR? 说说 InnoDB 与 MyISAM 的区别→

    最近更新
    01
    CPU 使用率较高排查和解决
    12-29
    02
    JVM OOM 问题如何排查和解决
    12-29
    03
    接口防刷怎么实现?
    12-29
    更多文章>
    Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式