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

数据库的三个范式及其含义

数据库范式(Normalization)是设计关系型数据库时遵循的规范化原则,旨在减少数据冗余、提高数据一致性。三个核心范式如下:


第一范式(1NF)

  • 定义:确保数据表的每一列都是原子性的(不可再分的最小数据单元),且每一行具有唯一标识(主键)。

  • 要求

    • 字段的值不可再拆分(如不能在一个字段中存储多个值)。

    • 每列存储单一属性的数据,且所有记录是唯一的。

  • 示例

    • 不符合1NF:学生表中的“联系方式”字段存储“电话1, 电话2”。

    • 符合1NF:将“联系方式”拆分为多个独立字段(如电话1、电话2),或拆分为多行。


第二范式(2NF)

  • 前提:满足1NF。

  • 定义:消除部分依赖,即非主属性必须完全依赖于主键(针对联合主键的情况)。

  • 要求

    • 表中不存在非主键字段仅依赖联合主键的一部分。

    • 若存在部分依赖,需将表拆分为多个表。

  • 示例

    • 不符合2NF:订单详情表(主键:订单ID + 产品ID)中包含“订单日期”(仅依赖订单ID)。

    • 符合2NF:拆分为订单表(订单ID、订单日期)和订单详情表(订单ID、产品ID、数量等)。


第三范式(3NF)

  • 前提:满足2NF。

  • 定义:消除传递依赖,即非主属性之间不能存在依赖关系。

  • 要求

    • 非主键字段必须直接依赖于主键,而不能间接通过其他非主键字段依赖。

  • 示例

    • 不符合3NF:学生表(学号、姓名、学院、学院电话)中,“学院电话”依赖“学院”,而非直接依赖学号。

    • 符合3NF:拆分为学生表(学号、姓名、学院ID)和学院表(学院ID、学院名称、学院电话)。


三个范式的区别

范式解决的问题核心规则
1NF数据原子性字段不可再分
2NF部分依赖非主属性完全依赖主键
3NF传递依赖非主属性直接依赖主键

规范化处理步骤

  1. 分析现有表结构:检查是否存在字段重复、部分依赖或传递依赖。

  2. 拆分表

    • 1NF:将多值字段拆分为独立字段或行。

    • 2NF:将部分依赖的字段拆分到新表中,确保非主属性完全依赖主键。

    • 3NF:将传递依赖的字段拆分到新表,消除间接依赖。

  3. 建立外键关联:通过外键维护拆分后的表之间的关系,确保数据完整性。


规范化的意义

  1. 减少数据冗余:相同数据只存储一次,避免空间浪费。

  2. 提高数据一致性:更新、删除操作只需修改一处,避免数据矛盾。

  3. 防止数据异常

    • 插入异常:无法插入部分数据(如未选课的学生无法录入)。

    • 删除异常:删除一条记录可能丢失其他信息(如删除学生导致学院信息丢失)。

    • 更新异常:修改多处冗余数据时遗漏导致不一致。

  4. 提升设计质量:结构清晰,易于扩展和维护。


总结

  • 范式是递进关系,通常需满足前一级范式才能进行下一级规范化。

  • 实际应用中,可能根据性能需求适当反规范化(如数据仓库中冗余存储以加速查询),但需权衡一致性与效率。

  • 规范化是数据库设计的基石,确保系统长期稳定和可维护。

举例1

给定关系模式R(U,F),U=(A,B,C,D),F=(AB→C,CD→B),关系R(1),且分别有(2)

(1)A、只有1个候选关键字ACB

         B、只有一个候选关键字BCD

         C、有2个候选关键字ACD和ABD

         D、有2个候选关键字ACB和BCD

(2)A、0个非主属性和4个主属性

         B、1个非主属性和3个主属性

         C、2个非主属性和2个主属性

         D、3个非主属性和1个主属性 

候选关键字求法:根据依赖集,找出从未在右边出现过的属性,必然是候选键之一,以该属性为基础,根据依赖集依次扩展,看能否遍历所有属性,将无法遍历的加入候选键。 

解析:
(1)题目中两个关系模式UF中从未在右边出现过的属性:AD,能否遍历所有属性:从F关系中可以看出,A无法单独推出任一属性,但如果加上B可以推出C,此时所有关系已经推出,因此ADB是候选关键字。除了ADB外还有一个候选关键字ADC,加上D后可以推出B,此时所有关系也可以推出,因此ADC也是一个候选关键字。选C。

(2)候选关键字中任一一个都是主属性,因此必然有4个主属性和0个非主属性。选A。

举例2

设有关系模式R(E,N,M,L,Q),其函数依赖集为F=(E→N,EM→Q,M→L),则关系模式R达到了(1);该关系模式(2)。

(1)A、1NF        B、2NF        C、3NF        D、BCNF

(2)A、无需进行分解,因为已经达到了3NF

         B、无需进行分解,因为已经达到了BCNF

         C、尽管不存在部分函数依赖,但还存在传递依赖,所以需要进行分解

         D、需要进行分解,因为存在冗余,修改操作的不一致性、插入和删除异常

解析:

(1)题目中从未在右边出现过的属性:EM,能否遍历所有属性:从题目看,这两个属性可以遍历完所有属性,因此EM就是候选键。但是可以看到EM单独可以决定N、L因此存在部分函数依赖,所以不属于第二范式,选A

(2)从(1)可以得出选D,达不到第二范式不可能达到3范式和BCNF范式,存在函数依赖。

相关文章:

  • 内网穿透:打破网络限制的利器
  • AI问答-供应链管理:SIPOC图 / 供方(S)、输入(I)、流程(P)、输出(O)、客户(C)
  • 前端面试题---小程序跟vue的声明周期的区别
  • STM32寄存器控制引脚高低电平
  • Python中if else以及嵌套
  • 1.68M 免安装多格式图片批量转 webp 无广告软件推荐
  • MySQL 性能优化
  • 开源工具推荐:Checkmate监控
  • AI触手可及 | 基于函数计算玩转AI大模型
  • 【Docker基础】理解 Registry 镜像仓库:分类、工作机制、命令与实操
  • 【多部电梯群控】01群控要求分析与策略简介
  • 面试基础---内存泄漏与内存溢出排查
  • 【图文详解】论文《Attention Is All You Need》中位置嵌入(Positional Encoding)的流程和作用
  • 关于回溯算法中的剪枝是否需要for循环的总结归纳
  • 51c嵌入式~电路~合集12
  • DeepSeek开源周Day4:三连发!突破 AI 训练瓶颈的立体解决方案,并行计算三剑客DualPipe、EPLB与Profile-data
  • 设计模式之责任链模式
  • Redis安装及其AnotherRedisDesktopManagera安装使用
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_init_cycle 函数 - 详解(4)
  • 【湖北省计算机信息系统集成协会主办,多高校支持 | ACM出版,EI检索,往届已见刊检索】第二届边缘计算与并行、分布式计算国际学术会议(ECPDC 2025)
  • 坚决打好产业生态培育攻坚战!陈吉宁调研奉贤区
  • 英国6月初将公布对华关系的审计报告,外交部:望英方树立正确政策导向
  • 再现五千多年前“古国时代”:凌家滩遗址博物馆今开馆
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新
  • 清雪车司机未拉手刹下车导致溜车被撞亡,事故调查报告发布
  • 全国人大常委会今年将初次审议检察公益诉讼法