面试题:数据库的三大范式是什么?

数据库的三大范式是数据库设计中用于减少数据冗余、提高数据一致性和完整性的规范规则。以下是它们的详细说明:


1. 第一范式(1NF)

  • 定义:表中的每一列都是不可分割的原子值(最小单元),即字段不能重复或包含多个值。
  • 核心要求
    • 每一列的值必须是单一的、不可再分的基本数据项。
    • 同一列中不能有多个值(如避免用逗号分隔的字符串存储多个数据)。
  • 示例
    假设有一个学生表 Student,其中字段 电话号码 存储了多个电话(如 1381234, 1395678),这违反了1NF。
    解决方案:将 电话号码 拆分为独立的表(如 Phone 表),并与 Student 表通过外键关联。
  • 作用
    • 避免数据冗余和更新异常(如修改一个电话需修改多个记录)。
    • 确保数据结构的简洁性和一致性。

2. 第二范式(2NF)

  • 定义:在满足1NF的基础上,非主键字段必须完全依赖于主键,而不是部分依赖。
  • 核心要求
    • 如果表存在复合主键(多个字段共同作为主键),所有非主键字段必须依赖于整个主键,而非主键的一部分。
  • 示例
    假设有一个订单详情表 OrderDetail,主键为 (订单ID, 商品ID),字段包括 商品名称 和 单价
    • 问题:商品名称 和 单价 只依赖于 商品ID(主键的一部分),而非整个主键,违反了2NF。

解决方案:将 商品名称 和 单价 移至独立的 Product 表,并通过外键 商品ID 关联。

  • 作用
    • 消除部分依赖,减少数据冗余。
    • 提高数据的一致性(如商品信息变更时只需修改一处)。

3. 第三范式(3NF)

  • 定义:在满足2NF的基础上,非主键字段之间不能存在传递依赖,即所有非主键字段必须直接依赖于主键。
  • 核心要求
    • 如果非主键字段 A 依赖于非主键字段 B,而 B 又依赖于主键,这称为传递依赖,需要消除。
  • 示例
    假设有一个员工表 Employee,主键为 员工ID,字段包括 部门ID 和 部门名称
    • 问题:部门名称 依赖于 部门ID(非主键字段),而 部门ID 依赖于主键 员工ID,形成传递依赖,违反了3NF。

解决方案:将 部门名称 移至独立的 Department 表,并通过外键 部门ID 关联。

  • 作用
    • 消除传递依赖,进一步减少冗余。
    • 保证数据的逻辑独立性和完整性。

总结:三大范式的层级关系

  1. 1NF → 2NF → 3NF
    • 1NF 是基础,2NF 建立在 1NF 之上,3NF 建立在 2NF 之上。
  2. 实际应用中的权衡
    • 通常数据库只需满足 3NF 即可。
    • 在高性能需求场景(如报表系统)中,可能适度违反范式(反规范化),通过冗余字段提升查询效率(如订单表中冗余用户姓名,避免频繁联表查询)。

关键点

  • 规范化的目标:减少冗余、避免更新异常、提高数据一致性。
  • 实际开发中的灵活性
    • 严格遵循范式可能增加联表查询复杂度,需根据性能需求权衡。
    • 在读多写少的场景(如数据仓库)中,常通过反规范化优化查询效率。
THE END
喜欢就支持一下吧
点赞14 分享