[ 数据库原理 ] 数据库范式概念:1NF、2NF、3NF、BCNF详解及其应用总结

2023-10-24 15:10

本文主要是介绍[ 数据库原理 ] 数据库范式概念:1NF、2NF、3NF、BCNF详解及其应用总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

文章目录

    • 一、数据库范式概念
    • 二、第一范式(1NF)
      • 2.1 第一范式示例
    • 三、第二范式(2NF)
      • 3.1 第二范式示例
      • 3.2 不满足第2范式可能出现的问题
    • 四、第三范式(3NF)
      • 4.1 第三范式示例
    • 五、巴斯-科德范式(BCNF)
      • 5.1 BCNF 范式示例
    • 六、总结(考试要考)

一、数据库范式概念

数据库范式:Normal form,缩写(NF)。按照经典教材——《数据库系统概论》中的定义:范式是 “符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。对没错,这就是天书级别的解释,讲中文翻译成白话中文可以理解为:

范式是用来衡量一组数据表是否符合某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。
数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。

满足最低要求的称为 1NF,在 1NF 的基础上进一步满足一些新要求的称为 2NF,以此类推,满足高级范式的一定满足低级范式,但满足低级范式的不一定满足高级范式。注意敲黑板化重点此处考试要考


二、第一范式(1NF)

R 为任一给定关系,若果 R 中每个列与行的交点处的取值都是不可再分的基本元素,则 R 为第一范式。

简单的说,强调的是列的原子性,即列不能够再分成其他的几列

第一范式是一个关系型数据库的最低标准,如果不满足第一范式,那么这个数据库就不是关系型数据库(划重点)。

2.1 第一范式示例

来一个不符合第一范式的举例:

可以看出"图书列"有两个值图书号书名两列,很明显这两个值可以再进行拆分,所以不满足第一范式。如果将该表规范到1NF可以拆分成如下表:

Redis关系型数据库,因为他的一个字段值可以是一个Map,其中存在key、value。key可以是字符型,value可以是日期型。故其不满足1NF,也就不能是关系型数据库了。


三、第二范式(2NF)

R 为任一给定关系,若 R 为 1NF,且其所有非主属性都完全函数依赖于候选关键字,则 R 为第二范式。

简单的说,第二范式要满足以下的条件:

  1. 要满足第一范式
  2. 每个非主属性要完全函数依赖于候选键,或者是主键(主码)

根据定义可以总结出:**只有在复合字段作主键时,才可能出现不满足2NF的情况。**第2范式告诉我们,不能使用组合键(联合主键/复合键),要使用唯一主键。

3.1 第二范式示例

针对1NF中的例子,假设例子中的主表主键为:读者号、图书号、借阅日期时,
非主属性姓名,单位号只依赖于读者号,和非主属性书名只依赖于图书号,即与关键码(读者号,图书号,借阅日期)存在部分函数依赖。故不属于 2NF,最高属于 1NF。

如若更改其满足2NF,则需拆分成如下表:

R1(读者号,姓名,单位号,单位名)
R3(图书号,书名)
R4(读者号,图书号,借阅日期,还书目期)

3.2 不满足第2范式可能出现的问题

  1. 数据冗余:若《周易》本书被同一个单位的人借 100 次,那么这个单位的单位名被重复记录100 次,造成大量数据冗余。
  2. 更新异常:若图书号对应的图书名字要变更,则需要将表中所有数据更新,不然可能会造成
  3. 插入异常:若《论语》这本书还没有被借出,那么这本书的基本信息将无法存储到这个关系中去,就会出现插入异常的问题。
  4. 删除异常:删除读者借阅图书信息时可能把读者的基本信息也删除了。

四、第三范式(3NF)

R 为任一给定关系,若 R 为 2NF,且其每一个非主属性都不传递函数依赖于候选关键字,则 R 为第三范式。

简单的说,第三范式要满足以下的条件:

  1. 首先要满足第二范式
  2. 非主属性之间不存在函数依赖

由于满足了第二范式,表示每个非主属性都函数依赖于主键。如果非主属性之间存在了函数依赖,那么非主属性与主属性之间就存在传递依赖,这样就不满足第三范式考试要考

4.1 第三范式示例

下面针对第三范式进行一个举例:

从上表中可以看出,非主属性单位号单位名存在依赖关系,那么,单位名称读者号就存在传递依赖。故不符合3NF。

如果需要修改上图表满足3NF,则需拆分成如下表:

R1(读者号,姓名,单位号)
R2(单位号,单位名)
R3(图书号,书名)
R4(读者号,图书号,借阅日期,还书目期)

五、巴斯-科德范式(BCNF)

R 为任一给定关系, XY 为其属性集, F 为其函数依赖集,若 R 为 3NF,且其 F 中所有函数依赖 X→Y(Y 不属于 X)中的 X 必包含候选关键字,则 RBCNF

简单的说,BCNF 是第三范式的补充,且要满足以下的条件:

  1. 满足前面的所有低级范式要求
  2. 主码(主键)之间不存在依赖

就是要在 3NF 的基础上消除主属性对于码的部分与传递函数依赖。


5.1 BCNF 范式示例

该例子候选键为:(学生,老师)和(学生课程),如果上述例子,设定主属性(主键)为:学生老师两列为复合主键,那么该例子满足3NF(因为不存在传递依赖)。


六、总结(考试要考)

范式作用特点
1NF:满足原子性,字段不可再分割字段都是单一属性
2NF:满足完全依赖,消除部分子函数依赖(列不能混着用)要求我们使用唯一主键
3NF:消除非主属性传递依赖非主属性之间不能存在函数依赖
BCNF:消除主属性传递依赖主码(主键)之间不存在依赖

只要是关系型数据库的表,都满足第一范式。第一范式本质更多的是对关系型数据库的一个限定。

第二、第三范式更多的是对数据库表合理设计的一个要求,理解第二、第三范式能够更好的帮助我们设计数据库表。

[ 本文作者 ]   bluetata
[ 原文链接 ]   https://bluetata.blog.csdn.net/article/details/119827087
[ 最后更新 ]   09/09/2023 22:10
[ 版权声明 ]   如果您在非 CSDN 网站内看到这一行,
说明网络爬虫可能在本人还没有完整发布的时候就抓走了我的文章,
可能导致内容不完整,请去上述的原文链接查看原文。

这篇关于[ 数据库原理 ] 数据库范式概念:1NF、2NF、3NF、BCNF详解及其应用总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/276020

相关文章

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

C语言中位操作的实际应用举例

《C语言中位操作的实际应用举例》:本文主要介绍C语言中位操作的实际应用,总结了位操作的使用场景,并指出了需要注意的问题,如可读性、平台依赖性和溢出风险,文中通过代码介绍的非常详细,需要的朋友可以参... 目录1. 嵌入式系统与硬件寄存器操作2. 网络协议解析3. 图像处理与颜色编码4. 高效处理布尔标志集合

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Java中的@SneakyThrows注解用法详解

《Java中的@SneakyThrows注解用法详解》:本文主要介绍Java中的@SneakyThrows注解用法的相关资料,Lombok的@SneakyThrows注解简化了Java方法中的异常... 目录前言一、@SneakyThrows 简介1.1 什么是 Lombok?二、@SneakyThrows

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Redis Pipeline(管道) 详解

《RedisPipeline(管道)详解》Pipeline管道是Redis提供的一种批量执行命令的机制,通过将多个命令一次性发送到服务器并统一接收响应,减少网络往返次数(RTT),显著提升执行效率... 目录Redis Pipeline 详解1. Pipeline 的核心概念2. 工作原理与性能提升3. 核

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大