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

软考高级:数据库规范化: 1NF、2NF、3NF和 BCNF AI 解读

数据库的规范化是数据库设计中的一个重要过程,旨在减少数据冗余和提高数据一致性。它通过一系列规则(称为范式)来优化数据库表的结构。
在这里插入图片描述

常见的范式有1NF、2NF、3NF和BCNF。让我们分别来解释这些范式。

========== 生活化例子 ==========

想象你在整理一个家庭成员信息的表格

  • 1NF:每个成员的名字、电话、家庭住址都被记录在一张表里。如果某个成员有多个电话号码或地址,我们可能会直接把这些信息用逗号隔开放在一个单元格中。
  • 2NF:你意识到,把多个电话号码或地址放在同一个单元格中很不方便,所以你决定为每个电话号码或地址建立单独的行,但仍保持成员信息的一致性。
  • 3NF:后来你发现,不同的成员住在同一个地址,把地址信息在每个成员的记录里重复存储浪费空间。于是你把地址单独存到另一个表中,建立一种引用关系。
  • BCNF:当家庭成员的记录变得复杂时,你发现某些成员的信息没有唯一的主键可以标识。你进一步优化表结构,确保每一个信息都有唯一、明确的主键。

========== 概念讲解 ==========
在这里插入图片描述

  1. 第一范式 (1NF)

    • 1NF的核心是每一个字段只能存储单一的值,不能有重复的列或多值的列。举例来说,在一个联系人信息的表格中,如果某个人有多个电话号码,我们不能把这些电话用逗号分隔后放在一个字段里,而是要为每个电话号码建立单独的行。
      在这里插入图片描述
  2. 第二范式 (2NF)

    • 2NF要求数据满足1NF,同时每个非主键字段都必须依赖于整个主键。这意味着如果一个表有复合主键(多个字段作为主键),那么每个非主键字段都必须依赖于全部主键,而不是主键的一部分。
    • 例如,如果有一个“课程-学生”表,主键是“课程ID+学生ID”,但有一列是“课程名称”,显然这列只依赖于“课程ID”,而不是整个主键。这种情况违反了2NF,需要把课程信息和学生信息分开存储。
      在这里插入图片描述
  3. 第三范式 (3NF)

    • 3NF在满足2NF的基础上,要求非主键字段不能依赖于其他非主键字段。换句话说,非主键字段只能依赖于主键。
    • 比如,有一个“学生-班级”表,主键是“学生ID”,而表中有一列是“班级名称”,另一列是“班主任名字”。因为“班主任名字”依赖于“班级名称”而不是“学生ID”,这种情况违反了3NF,需要将班级信息拆分到一个独立的表中。
      在这里插入图片描述
  4. BCNF (Boyce-Codd范式)

    • BCNF是3NF的加强版,它更严格地要求表格中每个字段的依赖关系必须依赖于候选键(主键或唯一键)。即使数据已经满足了3NF,如果主键的设计不够合理(如非主键也可以决定其他字段),可能仍会出现数据冗余的问题。
    • 举例来说,如果有一个表,包含“教师ID”、“课程ID”和“教师办公室”。可能存在某些情况下,教师ID和课程ID组合并不能唯一决定教师办公室。这时,就需要通过BCNF的规则重新设计表结构,避免这种情况。

========== 简单记法 ==========

  • 1NF:单元格不能有多值,即“每个格子只能装一个东西”。
  • 2NF:部分依赖要拆分,即“字段不能只依赖主键的一部分”。
  • 3NF:传递依赖要消除,即“非主键字段不能依赖其他非主键字段”。
  • BCNF:候选键规范化,即“任何字段都要唯一依赖主键”。

http://www.mrgr.cn/news/30767.html

相关文章:

  • Google Gemini 与 OpenAI 激烈竞赛:语音 AI 与未来智能体的技术演进
  • 基于Tesseract_OCR识别
  • 透明LED模块的应用场景
  • 简单题70.爬楼梯 (Java)2024920
  • Axure PR 9 步进器 设计交互
  • 国际知名度最高的华人改名大师颜廷利:当代最牛的易经姓名学泰斗
  • Spring 的循环依赖
  • .NET 一直跻身 30 大Github最活跃开源项目之列。
  • 【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!
  • MySQL_简介及安装、配置、卸载(超详细)
  • pig4cloud中RequestMatcher的添加
  • Python知识点:详细讲解在Python编程中,GIL(全局解释器锁)的影响与规避方法
  • Vue子组件样式受到父组件污染
  • 计算机组成原理之计算机硬件的基本组成
  • 会计稳健性Cscore模型(2000-2022年)
  • 深入探索NumPy
  • 等保测评:企业如何构建安全的网络架构
  • LIN总线CAPL函数—— 设置与测量从节点的波特率(linSetRespBaudrate)
  • 使用JavaWeb开发注册功能时,校验用户名是否已存在的一个思路(附代码)
  • 【雪球-注册安全分析报告-无验证方式导致安全隐患】