首页 > 其他分享 >范式(范式级别判断)

范式(范式级别判断)

时间:2024-06-14 19:31:58浏览次数:6  
标签:3NF 判断 范式 依赖 2NF 非主 级别 属性

范式是数据库设计中的一个重要概念,它描述了如何组织数据以确保数据的一致性和完整性。在关系数据库管理系统中,有几种主要的范式,分别是第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和更高级的BCNF(贝尔-科德范式)和第四范式(4NF)。以下是这些范式的简要概述:

 

1. 第一范式 (1NF):

   - 数据表中的每一列应包含原子值(不可再分割的基本单位),即每个字段只存储单一的信息。

   - 没有重复的列子集。

 

2. 第二范式 (2NF):

   - 1NF的基础上,消除部分依赖,即非主键属性必须完全依赖于主键,而不是仅仅部分依赖。

   - 消除组合键,即主键中的每个字段都必须能单独决定行。

 

3. 第三范式 (3NF):

   - 2NF的基础上,消除传递依赖,即非主键属性不依赖于其他非主键属性。

   - 数据表中的每一个非主键字段都只与主键直接相关。

 

4. BCNF(贝尔-科德范式):

   - 当关系模式存在3NF,且所有的非平凡依赖都是对码的直接依赖时,达到BCNF。这避免了部分函数依赖导致的数据冗余。

 

5. 第四范式 (4NF):

   - BCNF的进一步扩展,要求消除多值依赖,即不存在非平凡的多值依赖于候选码的情况,这有助于提高数据库的查询效率和优化空间。

6. 针对范式在数据库关系中

(1)1NF:所有属性都是不可分割的数据项

如果某个属性,例如学校,还可以继续拆分为高中和大学,就不满足1NF了。1NF是关系数据库需要满足的最低要求

(2)2NF:在满足1NF的前提下,不包含非主属性对码的部分函数依赖(即每一个非主属性都完全函数依赖于码)

例如在关系R中,码是学号和班级,非主属性是姓名,因为通过学号就能直接推出姓名了,不需要班级,此处姓名就部分依赖于码了,不满足2NF

(3)3NF:在满足2NF的前提下,不包含非主属性对码的传递函数依赖(即码应该直接决定非主属性,不能间接决定)

传递函数依赖:若X→Y,Y→Z.有Z→Z,此时称Z对x有传递函数依赖。

例如在关系R中,码是客户姓名,非主属性是订单编号和订单负责人,通过客户姓名可以推出他的订单编号,再通过订单编号能推出订单负责人,这种情况下客户姓名和订单负责人是间接决定的,存在传递函数依赖,不满足3NF(4)BCNF:消除任何属性对候选码的传递依赖,即每一个决定因素都包含

码,表现为在函数依赖集当中,左边的都包含候选码(整个属性组!)

(5)4NF:不允许有非平凡且非函数依赖的多值依赖多值依赖(例如X,Y,2属于集合U,且2=u-x-Y.当给定一组(x,2)值的时候,可以确定一组Y的值,但这组Y的值仅仅取决于x,此时有x→→Y。其实这里就是存在了一对多的关系,即一个x和一组2有关,但并不能唯一确定一个2,通过x和2能找到一组y,但你只通过x也能确定y。

平凡的多值依赖:z是空集

非平凡的多值依赖:z不是空集

7. 范式级别判断

例题:U=ABCDE,F=(A-C,BC-D,CD-A,AB-E)

第一步(求关键字):求关键字的过程略去,结果为{(AB),(BC)}

第二步(判断1NF):只要有属性就是1NF

第三步(写出非主属性、关键字):这一步是为了方便后续判断。

非主属性是未出现在关键字中的属性,本题为DE。关键字为AB和BC.如下列出:

非主属性:DE;候选码:AB、BC

F=(A→C,BC->D,CD->A,AB-E)

第四步(判断2NF):2NF的定义为非主属性应完全函数依赖于任一候关键字即看非主属性的左侧的推断条件中是否出现了候关键字也就是题目中D和E的左侧是否出现了AB或BCC其中B或BC必须一起打包出现,不能只出现单个的A,B之类)。举例来说,假如题目中存在A-D,D是非主属性,而左侧只有A,没有和B一起出现,即D不是完全函数依赖于候选码AB的,它只部分依赖了AB中的A。观察当前题目,非主属性D和E的左侧均是候关键字一,并不存在这种情况,那么它是满足2NF的。

第五步(判断3NF):在满足2NF的前提下(3NF的定义为不存在非主属性对任一候关键字传递函数依赖。举个例子,如果有AB-D,又有D→E,即非主属性E通过非主属性D作为桥梁才能推出,这就是传递依赖。尽管候关键字B能推出D和E,但E是间接推出的,也不可以出现,达续观察题目,并没有这种情况,那么是满足3NF的。

第六步(判断BCNF):在满足3NF的前提下,BCNF的条件是每一个决定因素(即每一个依赖关系的左侧)都包含码关键字即决定因素必须包含候关键字的任意一个。即在本题中,每个决定因素要么有AB,要么有BC.要么A和B成对出现,要么B和C成对出现。该题中,第一个关系A->C就只出现了A,A没有和B一起出现,所以本题不满足BCNF。注意这里和2NF的区别,2NF只看针对非主属性的左侧,而BCNF要看所有依赖关系的左侧。

因此本题为3NF。

8. 第1,2,3范式都在消除数据冗余,但一般不可能彻底消除

标签:3NF,判断,范式,依赖,2NF,非主,级别,属性
From: https://blog.csdn.net/qq_73340809/article/details/139609647

相关文章

  • 【ZZULIOJ】1105: 判断友好数对(函数专题)
    题目描述输入两个正整数m和n,顺序输出m到n之间的所有友好数对。如果两个整数的所有正因子之和(包括1,不包括自身)等于对方,就称这对数是友好的。例如:1184和1210是友好数对,因为1184的因子之和为1+2+4+8+16+32+37+74+148+296+592=12101210的因子之和为1+2+5+10+11+22+55+110+121+2......
  • 用C++判断Windows是否锁屏
    点击查看代码#include"windows.h"#include"Windows.h"#include"Wtsapi32.h"#include<tchar.h>#pragmacomment(lib,"WtsApi32.lib")usingnamespacestd;typedefHDESK(WINAPI*PFNOPENDESKTOP)(LPSTR,DWORD,BOO......
  • 推荐一个傻瓜级别的ElasticSearch搜索引擎开发框架,低代码很强大(带私活源码)
    背景众所周知,Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。其功能的强大我们无所质疑,但是其API的的使用可谓难倒了众多小白。为了解决大家使用门槛高的问题,今天给大家推荐一个开源的傻瓜级别的ElasticSearch搜索引擎开发框架:Easy-Es(简称EE)介绍官......
  • 深入分析事务的隔离级别
    本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象。并且介绍了在关系型数据库中不同的隔离级别的实现原理。在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性)。由于事务满足久性。所以......
  • 携手知名律所,合合信息旗下名片全能王打造数字化名片“新范式”
    在低碳办公理念盛行的当下,数字名片成为商务交流的新方式,以数字化智能化赋能绿色化。近期,合合信息旗下名片全能王企业数字名片升级,与上海市律师协会、广州市律师协会、北京大成(上海)律师事务所等多家律协及律所达成合作,推出的企业数字名片小程序可实现律师行业的定制化需求,全面赋能......
  • 实验3 中间代码生成 *语法制导的代码+生成语句代码生成+条件判断语句代码生成
    实验3中间代码生成help-assignment代码已完成除了语法树,编译器里另一个核心数据结构就是中间代码(IntermediateRepresentation,IR)。中间代码是编译器从源语言到目标语言之间采用的一种过渡性质的代码形式,往往介于语法树和汇编代码之间,其表示独立于机器,易于分析和翻译......
  • awk判断案例
    if语句格式:{if(表达式){语句;语句;...}}统计系统用户数0-1001系统用户,大于1000普通用户awk-F:'{if($3>0&&$3<1000){count++;}}END{printcount}'/etc/passwd记住:awk是逐行处理。所以对每一行进行判断处理后进行加1操作。打印普通用户awk-F:'{if($3>1000){print$1......
  • easyExcel判断合并单元格
    开发中遇到需求:1、查询一组单元格是否是一个合并单元格2、判断指定的单元格是否属于合并单元格区域之前用了POI的原生方法,但是excel太大,频繁的循环导致时间花费太长,因此打算改用easyExcel看看时间会不会少点。上网看了一下,easyExcel没有直接判断合并的方法,需要自己写。以下是......
  • 为什么在NLP中迟迟没有出现类似CV预训练的范式
    Q:2018年前,迁移学习在NLP中的运用情况如何?我们知道,直到2018年,ULM-FiT、GPT和BERT模型的出现才开启了NLP预训练模型的时代,才真正实现了CV领域那样的迁移学习方法在NLP领域的应用。那么,是不是说2018年前NLP领域就没有迁移学习呢?答案是,这个说法是非常不准确的!就如我们在6.4.3里预......
  • JavaScript判断数据为对象(转载)
    1.javaScript判断数据为对象1.1. Object.prototype.toString.call()2.JavaScript如何判断数据类型2.1. typeof2.2. Array.isArray()2.3. instanceof2.4. Object.prototype.toString.call()2.5. constructor2.6. 使用ES6的Symbol.toStringTa......