详解数据库范式

embedded/2025/3/15 8:44:38/

范式

  • 1. 第一范式(1NF)
  • 2. 第二范式(2NF)
  • 3. 第三范式(3NF)
  • 4. BC范式(BCNF,Boyce-Codd Normal Form)
  • 5. 第四范式(4NF)
  • 6. 第五范式(5NF)
  • 总结:

数据库设计中, 范式(Normal Forms, NFs)是一种用于规范化数据库结构的理论,用以消除数据冗余、提高数据一致性,同时减少异常问题。范式的核心思想是将数据划分成更小、更独立的表,并通过关系(外键)进行连接。

1. 第一范式(1NF)

目标:确保每列的值是原子值。

  • 要求:

    • 数据库表中的每一列只包含单一值(原子性)。
    • 不允许一列存储多个值(如数组、列表等),也不允许嵌套表。
  • 示例:不符合1NF

    学生ID姓名联系方式
    1张三12345, 67890
    2李四98765

    上述表中“联系方式”列包含了多个值,因此不符合1NF。

  • 改进(符合1NF)

    学生ID姓名联系方式
    1张三12345
    1张三67890
    2李四98765

2. 第二范式(2NF)

目标:消除非主属性对主键的部分依赖。

  • 要求:

    • 满足1NF。
    • 表中的每一个非主属性必须完全依赖于主键,而不能只依赖于主键的一部分(解决部分依赖)。
  • 示例:不符合2NF

    学生ID课程ID课程名称成绩
    1C001数学90
    1C002英语85

    假设主键是(学生ID, 课程ID)的组合,“课程名称”只依赖于课程ID,而不是组合主键,因此违反2NF。

  • 改进(分表,符合2NF)

    • 课程表:

      课程ID课程名称
      C001数学
      C002英语
    • 成绩表:

      学生ID课程ID成绩
      1C00190
      1C00285

3. 第三范式(3NF)

目标:消除非主属性之间的传递依赖。

  • 要求:

    • 满足2NF。
    • 非主属性之间不存在传递依赖(即非主属性不能依赖于另一个非主属性)。
  • 示例:不符合3NF

    学生ID系ID系名称
    1CS001计算机系
    2EE002电气工程系

    在此表中,“系名称”依赖于“系ID”,“系ID”又依赖于主键“学生ID”,这是一种传递依赖。

  • 改进(分表,符合3NF)

    • 学生表:

      学生ID系ID
      1CS001
      2EE002
    • 系表:

      系ID系名称
      CS001计算机系
      EE002电气工程系

4. BC范式(BCNF,Boyce-Codd Normal Form)

目标:消除主属性间的依赖关系。

  • 要求:

    • 满足3NF。
    • 对于每一个函数依赖 X → Y X \to Y XY X X X 必须是超键。(超键是一个或多个属性的组合,这些属性的值可以唯一地标识表中的每一行记录。换句话说,一个超键中的值是足够独特的,它能够用来区分表中的任意两条记录。)
  • 示例:不符合BCNF

    教师ID课程名称教室
    T001数学R101
    T002英语R102

    假设(教师ID, 课程名称)为主键,“教室”依赖于“课程名称”,“课程名称”不是超键,因此违反BCNF。

  • 改进(分表)

    • 课程表:

      课程名称教室
      数学R101
      英语R102
    • 教师课程表:

      教师ID课程名称
      T001数学
      T002英语

5. 第四范式(4NF)

目标:消除多值依赖。

  • 要求:

    • 满足BCNF。
    • 表中不能存在非主属性的多值依赖。
  • 示例:不符合4NF

    学生ID语言爱好
    1英语篮球
    1英语足球
    1法语篮球
    1法语足球

    上述表中,“语言”和“爱好”是独立的多值属性,存在多值依赖。

  • 改进(分表)

    • 学生语言表:

      学生ID语言
      1英语
      1法语
    • 学生爱好表:

      学生ID爱好
      1篮球
      1足球

6. 第五范式(5NF)

目标:消除连接依赖。

  • 要求:
    • 满足4NF。
    • 表中每一个关系都应该能够通过其更小的关系表连接复原(避免连接依赖)。

总结:

范式目标主要特点
1NF消除重复组,保证每列值原子性。每列只存储单一值。
2NF消除部分依赖,非主属性完全依赖主键。必须完全依赖主键,不允许部分依赖。
3NF消除传递依赖,非主属性只依赖主键。非主属性之间不能存在依赖关系。
BCNF消除主属性间依赖,所有函数依赖的决定因素为超键。更严格的3NF。
4NF消除多值依赖,每个关系只存储一个独立主题。解决多值属性独立的问题。
5NF消除连接依赖,确保关系可以通过小表复原。对复杂表分解到极致。

http://www.ppmy.cn/embedded/172720.html

相关文章

flutter 专题 八十八 Flutter原生混合开发

使用 Flutter 从头开始写一个 App是一件轻松惬意的事情。但是对于成熟产品来说,完全摒弃原有 App 的历史沉淀,全面转向 Flutter 并不现实。用 Flutter 去统一 iOS/Android 技术栈,把它作为已有原生 App 的扩展,然后通过逐步试验有…

如何使用Postman,通过Mock的方式测试我们的API

这篇文章将教会大家如何利用 postman,通过 Mock 的方式测试我们的 API。 什么是 Mock Mock 是一项特殊的测试技巧,可以在没有依赖项的情况下进行单元测试。通常情况下,Mock 与其他方法的主要区别就是,用于取代代码依赖项的模拟对…

树莓集团落子海南,如何重构数字产业生态体系​

树莓集团在海南的布局,是其整体商业战略中的关键一环。这背后,是对政策机遇、产业协同、以及区域优势的深度考量。 政策机遇 海南自贸港建设带来前所未有的政策红利,包括贸易、投资、资金等方面的自由便利。树莓集团紧抓这一机遇&#xff0…

Linux:基本指令与内涵理解

1.文件操作指令 1.1 ls ls指令用于查看指定层级文件夹下的文件或文件夹 基本格式:ls (选项) (查看层级) 其中选项处不写就默认是显示文件名,查看层级默认是当前层级 选项1: -l 作用:将查找文件的详细信息显示出来 我们…

03.Python基础2

1.Python语句 1.1行 (1) 物理行:程序员编写代码的行。 (2) 逻辑行:python解释器需要执行的指令。 (3) 建议: 一个逻辑行在一个物理行上。 如果一个物理行中使用多个逻辑行,需要使用分号;隔开。 (4) 换行&#xff…

迪威 3D 模型发布系统:制造业产品展示革新利器

在竞争激烈的制造业领域,如何将产品全方位、直观地呈现给客户,成为企业脱颖而出的关键。传统的产品展示方式往往受限于平面资料或有限的实物展示,难以让客户深入了解产品的复杂结构与精妙细节。迪威 3D 模型发布系统的问世,为制造…

Manus 一码难求,MetaGPT、OpenManus、Camel AI 会是替代方案吗?

Manus 一码难求,MetaGPT、OpenManus、Camel AI 会是替代方案吗? 一、Manus 的现象与问题 Manus 作为一款号称“全球首个通用 AI 智能体”的产品,凭借其强大的功能和新颖的营销策略迅速走红。然而,其封闭的邀请码机制和高昂的使用…

概率论的基本知识

逆概率还不懂,改天再想想。 联合概率 联合概率(Joint Probability) 是概率论中的一个重要概念,用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。