第一范式,第二范式,第三范式,BCNF范式理解

article/2025/8/25 14:15:54

第一范式、第二范式、第三范式

参考了https://www.zhihu.com/question/24696366
https://www.cnblogs.com/lca1826/p/6601395.html

基础知识

实体:现实世界中客观存在并可以被区别的事物。比如“一个学生”、“一本书”、“一门课”等等。值得强调的是这里所说的“事物”不仅仅是看得见摸得着的“东西”,它也可以是虚拟的,比如说“老师与学校的关系”。

属性:教科书上解释为:“实体所具有的某一特性”,由此可见,属性一开始是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。

元组:表中的一行就是一个元组。

分量:元组的某个属性值。在一个关系数据库中,它是一个操作原子,即关系数据库在做任何操作的时候,属性是“不可分的”。否则就不是关系数据库了。

码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。

全码:如果一个码包含了所有的属性,这个码就是全码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

第一范式

第一范式列不能再分。

第二范式

第二范式建立在第一范式的基础上,非主属性完全依赖于码。
简单说:消除部分依赖。

(什么是码?) 表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。主码可以包含多个属性。

要理解第二第三范式需要理解完全函数依赖、部分函数依赖、传递函数依赖。


完全函数依赖

定义:设X,Y是关系R的两个属性集合,X’是X的真子集,存在X→Y,但对每一个X’都有X’!→Y,则称Y完全函数依赖于X。

比如通过学号->姓名


部分函数依赖

定义:设X,Y是关系R的两个属性集合,存在X→Y,若X’是X的真子集,存在X’→Y,则称Y部分函数依赖于X。

需要借用知乎刘慰教师的例子用一下,自己也理解了很长时间。

码用(学号+课程),为什么要加课程呢?因为不同课程成绩是通过学号查不出来的。

不过用(学号+课程)当作码是不是有些问题?

(学号+课程)->姓名,但是学号->姓名

(学号+课程)->系名,但是学号->系名

(学号+课程)->系主任,但是学号->系主任

这个就是部分依赖,说实话我看定义一脸懵逼。

要是上面那张表符合第二范式。需要将表拆分为两张表。

一张是 学号、课程、分数表

另外一张是 学号、姓名、系名、系主任表


传递函数依赖

设X,Y,Z是关系R中互不相同的属性集合,存在X→Y(Y !→X),Y→Z,则称Z传递函数依赖于X。

https://blog.csdn.net/rl529014/article/details/48391465

采用这位大佬的例子
在关系R(学号 ,宿舍, 费用)中,(学号)->(宿舍),宿舍!=学号,(宿舍)->(费用),费用!=宿舍,所以符合传递函数的要求

第三范式

满足第二范式的条件下不存在传递函数依赖。

要满足第三范式,在分成两张表的时候第二张表还是有问题?

学号->系名,系名->系主任 传递依赖。

需要将系名和系主任另外新建一张表。

总结:

第一范式:简单说 列不能再分

第二范式:简单说 建立在第一范式基础上,消除部分依赖

第三范式:简单说 建立在第二范式基础上,消除传递依赖。


码:表中可以唯一确定一个元组的某个属性(或者属性组),如果这样的码有不止一个,那么大家都叫候选码,我们从候选码中挑一个出来做老大,它就叫主码。

主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。

非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。

BCNF范式

https://www.2cto.com/database/201404/290140.html

BCNF是3NF的改进形式

一个满足BCNF的关系模式的条件:

1.所有非主属性对每一个码都是完全函数依赖。

2.所有的主属性对每一个不包含它的码,也是完全函数依赖。

3.没有任何属性完全函数依赖于非码的任何一组属性。

如上表

(仓库名,管理员)->(物品名,数量)

(管理员,物品名)->(仓库名,数量)

但是(仓库名)->(管理员) 不满足第二条

所以需要改成两种表:

第一张:仓库名,管理员

第二张:仓库名,物品名,数量


http://chatgpt.dhexx.cn/article/sEQMDF6v.shtml

相关文章

数据库|第一范式、第二范式、第三范式、BC范式、第四范式简单理解

数据库|第一范式、第二范式、第三范式、BC范式、第四范式简单理解 在设计数据库的时候,虽说将我们要的数据正确完整导入数据库是很关键的,但是对于数据库的设计者来说,如何将大量数据合理有效正确地导入数据库中也是极其关键的,好…

简单了解第一,二,三范式(图文详细)

简单了解第一,二,三范式 什么是范式第一范式第二范式第三范式 什么是范式 范式:范式是符合某一种级别的关系模式的集合,表示一个关系内部属性之间的联系何合理化程度 粗略理解:就是一张数据表的表结构所符合的某种设…

第一范式、第二范式、第三范式、BCNF范式详解

文章目录 0. 范式(NF)1. 第一范式(1NF)2. 第二范式(2NF)2.1 函数依赖2.1.1完全函数依赖2.1.2 部分函数依赖2.1.3 传递函数依赖 2.2 码2.3 非主属性 3. 第三范式(3NF)4. BCNF范式5. 小结6. 参考文献 0. 范式…

详解第一范式、第二范式、第三范式、BCNF范式

GITHUB: https://github.com/wenkechen 文章目录 什么是”范式(NF)”1. 第一范式(1NF)2. 第二范式(2NF)2.1 函数依赖2.1.1完全函数依赖2.1.2 部分函数依赖 2.2 码2.3 非主属性 3. 第三范式(3NF)4. 小结 什么…

范式说明:第四范式

4NF取决于多值依赖的概念。 FD函数依赖(X→Y表示:X函数决定Y,或Y函数依赖于X),主要解决了关系R中属性值之间的“多对一”联系,即属性X与属性Y是“多对一”。而多值依赖主要是解决属性值之间的“一对多”联系…

数据库关系范式——第一范式、第二范式、第三范式、BC范式【通俗易懂,博主会讲人话】

范式:是符合某一种级别的关系模式的集合。 说白了,就是对关系模式的一种规范化。 范式分为:第一范式、第二范式、第三范式、BC范式、第四范式、第五范式。后面两种在这里不讨论。 1、第一范式(1NF):关系模式S中的所有属性都是不…

数据库三大范式、BC范式、第四范式

目录 第一范式(1NF):原子性(存储的数据应该具有“不可再分性”)第二范式(2NF):唯一性 (消除非主键部分依赖联合主键中的部分字段)(一定要在第一范式已经满足的情况下&…

【高效学数据库】第一范式、第二范式、BCNF范式、第三范式、第四范式概念及举例

本专栏将从基础开始,循序渐进的讲解数据库的基本概念以及使用,希望大家都能够从中有所收获,也请大家多多支持。 专栏地址: 数据库必知必会 如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。 …

数据库-第一范式、第二范式、第三范式、BC范式、第四范式简析

在设计与操作维护数据库时,最关键的问题就是要确保数据能够正确地分布到数据库的表中。使用正确的数据结构,不仅有助于对数据库进行相应的存取操作,还可以极大地简化应用程序中的其他内容(查询、窗体、报表、代码等),按照“数据库…

专访戴文渊:第四范式(现在)是一家怎样的公司?

李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI △ 第四范式创始人及CEO戴文渊 第四范式是一家备受关注的公司。 仅创始团队成员来看,哪一个不是计算机、机器学习领域响当当的名字? 戴文渊是ACM2005全球冠军,百度机器学习系统带队打造者&…

Spark数据倾斜优化

Spark数据倾斜 就是数据分到各个区的数量不太均匀,可以自定义分区器,想怎么分就怎么分。 Spark中的数据倾斜问题主要指shuffle过程中出现的数据倾斜问题,是由于不同的key对应的数据量不同导致的不同task所处理的数据量不同的问题。 例如,reduced端一共…

Flink中的数据倾斜与解决方案实践

什么是数据倾斜 在使用一些大数据处理框架进行海量数据处理的过程中,可能会遇到数据倾斜的问题,由于大数据处理框架本身架构的原因,在框架层面,数据倾斜问题是无法避免的,只能在业务层面来缓解或者避免。 因为要处理…

spark处理数据倾斜的案例

在前期的工作遇到了很多数据倾斜的案例,在此记录下解决的心得 1) 大表join小表: 执行某段sql,出现了Executor OOM的现象,查看其stage的状况: 第3个stage读取了21.1G的数据,并shuffle写入了2.6G的数据,由于两个表根据字…

redis之数据倾斜如何处理

写在前面 我们在使用Redis分片集群时,集群最好的状态就是每个实例可以处理相同或相近比例的请求,但如果不是这样,则会出现某些实例压力特别大,而某些实例特别空闲的情况发生,本文就一起来看下这种情况是如何发生的以及…

实操 | Hive 数据倾斜问题定位排查及解决

Hive 数据倾斜怎么发现,怎么定位,怎么解决 多数介绍数据倾斜的文章都是以大篇幅的理论为主,并没有给出具体的数据倾斜案例。当工作中遇到了倾斜问题,这些理论很难直接应用,导致我们面对倾斜时还是不知所措。 本文首发在…

数据倾斜原理及解决方案

导读 相信很多接触MapReduce的朋友对数据倾斜这四个字并不陌生,那么究竟什么是数据倾斜?又该怎样解决这种该死的情况呢? 何为数据倾斜? 在弄清什么是数据倾斜之前,我想让大家看看数据分布的概念: 正常的数据分布理论上都是倾斜的,就是我们所说的20-80原理&…

spark 数据倾斜调优

数据倾斜应该算是一个比较麻烦的问题,笔者也是刚刚开始学习相关的调优,将看到的比较全面、清晰的几种解决方案整合了一下,并加上了一些理解与心得,供参考! 首先,需要对spark执行计划有一定的基础与理解&am…

如何解决mysql数据倾斜_数据倾斜解决方案

1)聚合原数据(主要操作的是hive数据库中的数据,先通过hive sql将相同key的数据聚合成一条数据,再进行map操作) 当没办法聚合成一条数据时:增大key粒度,从而key的数量会减少,但是每个key对应的数据量会增大&#xff0c…

数据倾斜及其解决方式

数据倾斜是大数据领域绕不开的拦路虎,当你所需处理的数据量到达了上亿甚至是千亿条的时候,数据倾斜将是横在你面前一道巨大的坎。很可能有几周甚至几月都要头疼于数据倾斜导致的各类诡异的问题。 数据倾斜是指:mapreduce程序执行时&#xff0…

Hive 数据倾斜

数据倾斜,即单个节点任务所处理的数据量远大于同类型任务所处理的数据量,导致该节点成为整个作业的瓶颈,这是分布式系统不可能避免的问题。从本质来说,导致数据倾斜有两种原因,一是任务读取大文件,二是任务…