当前位置: 首页 > 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范式,存在函数依赖。

举例3

给定关系模式R(U,F),其中:属性集U={A1,A2,A3,A4,A5,A6},函数依赖集F={A1→A2,A1→A3,A3→A4,A1A5→A6}。关系模式R的候选码为(1),由于R存在非主属性对码的部分函数依赖,所以R属于(2)。

(1)A、A1A3        B、A1A4        C、A1A5        D、A1A6

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

解析:

1)题目中从未在右边出现过的属性:A1A5,能否遍历所有属性:从题目看,这两个属性可以遍历完所有属性,因此A1A5就是候选码。第(1)题答案选C。

2)题目中由于R存在非主属性对码的部分函数依赖,这很明显是2NF的要求,达不到2NF只能是1NF,第(2)题答案选A。

举例4

给定关系R(A1,A2,A3,A4,A5)上的函数依赖集F={A1→A2A5,A2→A3A4,A3→A2},R的候选关键字为(1)。函数依赖(2)∈F+。

(1)A、A1        B、A1A2        C、A1A3        D、A1A2A3

(2)A、A5→A1A2

         B、A4→A1A2

         C、A3→A2A4

         D、A2→A1A5

解析:

1)题目中从未在右边出现过的属性:A1,能否遍历所有属性:从题目看,这个属性可以遍历完所有属性,因此A1就是候选码,第(1)题选A。

2)A5→A1A2无法通过F推导出,排除

3)A4→A1A2无法通过F推导出,排除

4)由题目中A3→A2,A2→A3A4,可以得出A3→A2A4,第(2)题选C

5)由题目中A2→A3A4,A3→A2,无法得出A2→A1A5,排除

第(2)题更简单的推理办法,因为A1是候选键,无法通过其他非主键推导,选C。


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

相关文章:

  • 【大模型应用之智能BI】基于 Text2SQL 的 GenBI 技术调研和深度分析(包含案例)
  • nv docker image 下载与使用命令备忘
  • Redis初识
  • DeepSeek 202502 开源周合集
  • Android手机部署DeepSeek
  • 《Somewhat Practical Fully Homomorphic Encryption》笔记 (BFV 源于这篇文章)
  • 初阶数据结构(C语言实现)——3顺序表和链表(2)
  • 【Python 入门基础】—— 人工智能“超级引擎”,AI界的“瑞士军刀”,
  • 达梦:内存相关参数
  • vue3中将table表格导出excel的方法
  • 微服务2025/2/15
  • 【Maui】系统找不到指定的文件Xamarin.Android.Aapt2.targets
  • 蓝桥杯备赛-拔河
  • Flutter - 布局Widget
  • 矩阵 trick 系列 题解
  • Professional Pycharm教程
  • 【多模态大模型】GLM-4-Voice端到端语音交互机器人VoiceAI
  • 腿足机器人之十三-强化学习PPO算法
  • 每日学习Java之一万个为什么?[MySQL面试篇]
  • ubuntu22.04安装docker engine