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

3NF讲解

3NF讲解

3NF(第三范式)是数据库设计中的一种规范化方法,目的是消除数据冗余和避免数据异常。它帮助数据库保持高效,灵活和一致性。理解3NF的关键点在于它依赖于前两个范式(1NF和2NF)的基础。

1. 第一范式(1NF):确保数据表格中的每一列都具有原子性。

  • 原子性:每个单元格只存储单一的值,不能由重复的值或多值。

示例:一个表格中,存储每个订单的商品数据,不应存储多个商品名称在同一列。

订单号商品名称
001苹果,香蕉
002橙子,苹果

改进后(1NF):

订单号商品名称
001苹果
001香蕉
002橙子
002苹果

2. 第二范式(2NF):在1NF的基础上,确保所有非主属性完全依赖于主键。

  • 完全依赖:即所有非主键列应该完全依赖于主键列,而不是部分依赖。也就是说,主键是复合键时,非主键字段不能只依赖于主键的其中一部分。

示例:假设有一个表格,存储学生成绩信息,表中同时包含了学生的基本信息和成绩信息。

学生ID课程ID学生姓名课程名称成绩
1001101张三数学95
1001102张三语文88
1002101李四数学90

这个表中,学生姓名课程名称与主键(学生ID, 课程ID)部分依赖,不符合2NF。

改进后(2NF)

  • 学生表(只包含学生基本信息)

    学生ID学生姓名
    1001张三
    1002李四
  • 课程表(只包含课程基本信息)

    课程ID课程名称
    101数学
    102语文
  • 成绩表(包含成绩)

    学生ID课程ID成绩
    100110195
    100110288
    100210190

3. 第三范式(3NF):在2NF的基础上,确保不存在传递依赖。

  • 传递依赖:如果A -> B,B -> C,那么A -> C就是传递依赖。3NF要求消除这种依赖。

示例:在2NF的基础上,如果某表中有学生ID、学生姓名、学生所在系等信息,且学生姓名决定学生所在系(即,学生姓名 -> 所在系),那么就存在传递依赖(学生ID -> 学生姓名 -> 所在系)。

改进后(3NF)

  • 学生表(只包含学生基本信息)

    学生ID学生姓名
    1001张三
    1002李四
  • 系表(只包含系的基本信息)

    系ID系名称
    001计算机
    002物理
  • 学生-系表(包含学生与所在系的关系)

    学生ID系ID
    1001001
    1002002
  • 成绩表(不变)

    学生ID课程ID成绩
    100110195
    100110288
    100210190

通过这些调整,表中的数据不再存在冗余,且便于维护与查询。

总结:

  • 1NF:每个单元格包含单一数据。
  • 2NF:消除部分依赖,确保每个非主属性完全依赖于主键。
  • 3NF:消除传递依赖,确保每个非主属性只依赖于主键,不通过其他非主属性。

3NF的核心目的是减少数据冗余和避免数据不一致性,同时也能提升数据库的维护性。

http://www.lryc.cn/news/532479.html

相关文章:

  • Spring Boot框架下的单元测试
  • AI测试工程师成长指南:以DeepSeek模型训练为例
  • 【数据结构】_队列的结构与实现
  • 机器学习--2.多元线性回归
  • MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)
  • 朴素贝叶斯原理
  • k8s中,一.pod污点,二.pod容器污点容忍策略,三.pod优先级(PriorityClass类)
  • 【重生之学习C语言----水仙花篇】
  • 两步构建 AI 总结助手,实现智能文档摘要
  • 承压金字塔(蓝桥杯17C)
  • day33-数据同步rsync
  • Android 实现首页Tab切换并且支持懒加载功能详解
  • [Android] 360行车记录仪谷歌版
  • 基于Redis分布式锁
  • Spring Boot 条件注解:@ConditionalOnProperty 完全解析
  • canny边缘检测
  • 团建 蓝桥杯省a 15
  • 【逻辑学导论】1.6 有效性和真实性
  • IDEA 中集成 Maven,配置环境、创建以及导入项目
  • Qt跨屏窗口的一个Bug及解决方案
  • Vue WebSocket简单应用 ws
  • 快速单机部署ollama v0.5.7 +openwebui(免去网络环境干扰)
  • 【华为OD-E卷 - 114 找最小数 100分(python、java、c++、js、c)】
  • 快速搭建GPU环境 | docker、k8s中使用gpu
  • VSCode设置——通过ctrl+鼠标滚动改变字体大小(新版本的vs)
  • 【kafka实战】06 kafkaTemplate java代码使用示例
  • Java 23新特性
  • bat脚本实现自动化漏洞挖掘
  • [创业之路-285]:《产品开发管理-方法.流程.工具 》-1- IPD的功能列表以及导入步骤
  • Redis命令:列表模糊删除详解