第一范式、第二范式、第三范式的区别(关系数据理论)

2024-03-04 16:50

本文主要是介绍第一范式、第二范式、第三范式的区别(关系数据理论),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关系数据理论

使用关系数据库理论来进行关系数据库的逻辑设计,简单来说就是针对一个具体问题,使用关系数据理论来构造适合于它的数据库模式

⭐️数据依赖

数据依赖是一个关系内部属性与属性之间的一种约束关系。通过属性间值的相等与否体现出来的。是现实世界属性间相互联系的抽象,是数据内在的性质,是语义的体现。
数据依赖最重要的是函数依赖(Functional Dependency,FD)和多值依赖(Multi- Valued Dependency,MVD)

函数依赖

函数依赖普遍存在于现实生活中,例如描述一个学生的关系,有学号(Sno)、姓名(Sname)、系名(Sdept)等属性。现实世界中,一个学生对应一个学生,一个学生只属于一个系,因而学号确定后,学生所在的系也就确定了,这就称为一个函数依赖。记作 S n o → S d e p t Sno \rightarrow Sdept SnoSdept(读作Sno决定Sdept)。
💡简单理解为Sno和Sdept之间存在某种函数对应关系。

函数依赖不是指关系模式R的某些关系满足的约束条件,而是指R的一切关系均要满足的约束条件的集合

函数依赖相关术语
  • X → Y X \rightarrow Y XY,则称 X X X为这个函数依赖的决定属性组,又称决定因素,读作 X X X决定 Y Y Y
    ⚠️X、Y是属性或者属性集, X → Y X \rightarrow Y XY Y Y Y依赖 X X X X X X决定 Y Y Y

  • X → Y X \rightarrow Y XY,但 Y ⊈ X Y \nsubseteq X YX,则称 X → Y X \rightarrow Y XY非平凡的函数依赖
    ⚠️ X ⊆ Y X \subseteq Y XY Y Y Y包含 X X X

  • X → Y X \rightarrow Y XY,但 Y ⊆ X Y \subseteq X YX,则称 X → Y X \rightarrow Y XY平凡的函数依赖。对于任一关系模式,平凡的函数依赖均必然成立,不反映新的语义(没什么用,一般不考虑)。

  • ⭐️在 R ( U ) R(U) R(U)中,如果 X → Y X \rightarrow Y XY,并且对于 X X X的任何一个真子集 X ′ X^{'} X,都有 X ′ ↛ Y X^{'} \nrightarrow Y XY,则称 Y Y Y X X X完全函数依赖,记作 X ⟶ F Y X\stackrel{F}{\longrightarrow}Y XFY
    💡只有 X X X整个集合才能决定 Y Y Y成为完全函数依赖,存在 X X X中的一子属性决定 Y Y Y称为部分函数依赖。

    • ⭐️同理,若 X → Y X \rightarrow Y XY,但 Y Y Y不完全依赖于 X X X,则称** Y Y Y X X X部分函数依赖**,记作 X ⟶ P Y X\stackrel{P}{\longrightarrow}Y XPY
  • R ( U ) R(U) R(U)中,如果 X → Y X \rightarrow Y XY Y → Z Y \rightarrow Z YZ Y ↛ X , Y ⊈ X , Z ⊈ Y Y \nrightarrow X, Y \nsubseteq X,Z \nsubseteq Y YX,YX,ZY),则称Z对X传递函数依赖,记作 X ⟶ 传 递 Y X\stackrel{传递}{\longrightarrow}Y XY

    image-20210322114203235

    这个地方的概念必须得看懂。

码的函数依赖定义
  • K K K R < U , F > R<U,F> R<U,F>中的属性火属性组合,若 K ⟶ F U K \stackrel{F}{\longrightarrow} U KFU,即 U U U完全函数依赖于 K K K,则称 K K K R R R候选码若候选码多于一个,选定其中一个为主码
  • 如果 U U U部分函数依赖于 K K K,则称 K K K超码。候选码是最小的超码,即 K K K的任一真子集都不是候选码。
  • 包含在候选码中的属性成为主属性,否则称为非主属性。整个属性组全是码,称为全码
image-20210322114050048

🈚️多值依赖

范式与规范化

规范化要讨论一个模式的数据依赖会有哪些不好的性质,以及如何改造一个不好的模式。一个低一级范式的关系模式通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化

范式表示关系的某一级别,常称某一关系模式 R R R为第几范式, R R R为第几范式可以写成 R ∈ x N F R \in xNF RxNF,各种范式之间的关系为 5 N F ∈ 4 N F ∈ B C N F ∈ 3 N F ∈ 2 N F ∈ 1 N F 5NF \in 4NF \in BCNF\in 3NF \in 2NF \in 1NF 5NF4NFBCNF3NF2NF1NF

第一范式

关系作为一个二维表,要符合一个最基本的条件:每一个分量必须是不可分的数据项(表不能有子表)。满足了这个条件的关系模式就属于第一范式(1NF)

第二范式

R ∈ 1 N F R∈1NF R1NF,且每一个非主属性完全函数依赖于任何一个候选码,则称为第二范式,记作 R ∈ 2 N F R∈2NF R2NF
2NF通过消除部分函数依赖,可以在一定程度上减轻1NF中存在的插入异常、删除异常、数据冗余大、修改复杂等问题,但并不能完全消除关系模式的各种异常情况和数据冗余。

第三范式(3NF)

我们抛开形式化的定义,直接从一个例子入手来理解。

2NF回顾

例如,2NF采用投影分解法,把 S − L − C S-L-C SLC解为两个关系模式 S C SC SC S − L S-L SL消除了 S − L − C S-L-C SLC中非主属性对码的部分函数依赖。

image-20210321162816984

💡简单来说就是再拆分几张表出来,让表中只剩下完全依赖,部分依赖是一切问题的根源。

按照这种方法把1NF关系模式分解为多个2NF的关系模式,可以减轻1NF关系模式中存在的插入异常、删除异 常、数据冗余度大、修改复杂等问题,但并不能完全消除关系模式中的各种异常情况和数据冗余。

2NF中的问题

例如,在 S − L ( S n o , S d e p t , S l o c ) S-L(Sno, Sdept, Sloc) SL(Sno,Sdept,Sloc)关系模型中, S l o c Sloc Sloc依赖于 S d e p t Sdept Sdept S d e p t Sdept Sdept又依赖于 S n o Sno Sno,即 S − L S-L SL中存在非主属性对码的传递函数依赖 S n o ⟶ 传 递 S l o c Sno\stackrel{传递}{\longrightarrow}Sloc SnoSloc

image-20210321165234427

然而,这其中存在的问题有:

  1. 插入异常
    如果某个系暂时没有在校学生,我们就无法把这个系的信息存入数据库。

  2. 删除异常
    如果某个系的学生全部毕业了,我们在删除该系全部学生信息的同时,就把这个系的信息也丢掉了。

  3. 数据冗余度大
    每一个系的学生都住在同一个地方,按理来说只存一次就行了,但关于在每个学生信息里,该系的住处的信息却重复出现。

  4. 修改复杂
    学校调整学生住处时,由于刚刚提到的关于每个系的住处信息是重复存储的,修改时必须同时更新该系所有学生的 S l o c Sloc Sloc属性值。

问题原因

S − L S-L SL S l o c Sloc Sloc传递函数依赖于 S n o Sno Sno, 即非主属性传递函数依赖码
💡可见非主依赖这个东西是一切问题的根源。

2NF问题的解决办法

依然是采用投影分解法,把 S − L S-L SL分解为两个 关系模式,以消除传递函数依赖: S − D ( S n o , S d e p t ) S-D(Sno, Sdept) SDSnoSdept D − L ( S d e p t , S l o c ) D-L(Sdept, Sloc) DLSdeptSloc S − D S-D SD的码为Sno, D − L D-L DL的码为Sdept。

image-20210321174528969

在分解后的关系模式中既没有非主属性对码的部分函数依赖, 也没有非主属性对码的传递函数依赖,进一步解决了上述四个 问题。
💡解决依赖问题的办法:把一张大表拆成多个小表。

⭐️3NF关系模式的性质

  • R ∈ 3 N F R\in3NF R3NF,则** R R R的每一个非主属性既不部分函数依赖于候选码也不传递函数依赖于候选码**。
  • R ∈ 3 N F R\in3NF R3NF,则 R ∈ 2 N F R\in2NF R2NF
  • 采用投影分解法将一个 2 N F 2NF 2NF的关系分解为多个 3 N F 3NF 3NF的关系,可以在一 定程度上解决原 2 N F 2NF 2NF关系中存在的插入异常、删除异常、冗余度、修改复杂等问题。但依然并不能完全消除关系模式中的各种异常情况和数据冗余。

BC范式(BCNF)

是由Boyce和Codd提出的,比 3 N F 3NF 3NF更进了一步。通常认为 B C N F BCNF BCNF是修正的第三范式,有时也称为扩展的第三范式

引入实例

仍然从一个例子来入手。关系模式 S T J ( S , T , J ) STJ(S,T,J) STJSTJ中, S S S表示学生, T T T表示教师, J J J表示课程。
先来分析一下语义(即从现实世界的情况入手来分析依赖):

  1. 假设每一教师只教一门课: T → J T→J TJ

  2. 假设每门课只由一个教师教,学生选定某门课,就能确定了一个固定的教师: ( S , J ) → T (S,J)→T SJT

    1. 学生选修某个教师的课就确定了所选课的名称: ( S , T ) → J (S,T)\rightarrow J (ST)J

    ⚠️这里我们一直都在用假设化简情况,自己仔细思考一下,可想而知现实世界中这样的依赖关系有多么复杂,这也就是范式这个东西的重要性所在。

    image-20210321203639514

在该例中, 候选码为 ( S , J ) (S,J) (SJ) ( S , T ) (S,T) (ST) ,可见 S S S T T T J J J 都是主属性,不存在非主属性对码的部分函数依赖 和传递依赖,所以 S T J ∈ 3 N F STJ\in3NF STJ3NF

虽然这是一个第三范式模型,但它仍存在增删改等异常,还不是一个理想的关系模式。

3NF中的问题

  1. 插入异常
    如果某个教师开设了某门课程,但尚未有学生选修,则有关信息也无法存入数据库中。
  2. 删除异常
    如果选修过某门课程的学生全部毕业了,在删除这些学生元组的同时,相应教师开设该门课程的信息也同时丢掉了。
  3. 数据冗余度大
    虽然一个教师只教一门课,但每个选修该教师该门课程的学生元组都要记录这一信息。
  4. 修改复杂
    某个教师开设的某门课程改名后,所有选修了该教师该门课程的学生元组都要进行相应修改。

问题原因

仔细观察,又是因为本该无关的数据之间存在依赖关系,需要再分解。即主属性 J J J部分依赖于码 ( S , T ) (S, T) (S,T)。因为 T → J T\rightarrow J TJ
⚠️3NF中主属性和主属性之间可能存在部分依赖。

解决办法

采用投影分解法,将 S T J STJ STJ分解为二个关系模式: S J ( S , J ) SJ(S,J) SJ(SJ) T J ( T , J ) TJ(T,J) TJ(TJ)
这样 S J SJ SJ的码为 ( S , J ) (S,J) (SJ) T J TJ TJ的码为 T T T

image-20210321204805386

在分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖。 它解决了上述四个问题。

BCNF关系模式的性质

  1. 所有非主属性对每一个码都是完全函数依赖。
  2. 所有主属性对每一个不包含它的码也是完全函数依赖。
  3. 没有任何属性完全函数依赖于非码的任何一组属性。

💡全是完全依赖,全是码就完事了。

BCNF的意义

如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了操作异常诸多问题

规范化总结

  • 一个关系模式只要其分量都是不可分的数据项,它就是规范化的关系模式,但这只是最基本的规范化。
  • 规范化程度过低的关系模式不一定能够很好地描述现实世界,可能会存在插入异常、删除异常、修改复杂、数据冗余等问题,解决方法就 是对其进行规范化,转换成高级范式。
  • 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式集合,这种过程就叫关系模式的规范化
  • 关系数据库的规范化理论是数据库逻辑设计的工具。
  • 高级的关系模型必然包含低级的关系模型。

关系模型规范化基本步骤

image-20210321210137393

规范化的基本思想

  • 逐步消除数据依赖中不合适的部分,使模式中的各关系模式达到某种程度的“分离”
  • 采用“一事一地”的模式设计原则
    一个关系只描述一个概念、一个实体或者实体间的一种联系,若多于一个概念,就把它“分离”出去。
  • 规范化实质上是概念的单一化

🈚️数据依赖的公理系统

模式分解的理论基础是数据依赖的公理系统(ArmStrong公理系统),是一套推理规则。

模式分解

关系模式的规范化过程是通过对关系模式的模式分解来实现的。

模式分解的抽象定义

R < U , F > R<U,F> R<U,F>的一个分解是指:$\rho={R_1<U_1,F_1>, …, R_n<U_n,F_n>} , 其 中 , 其中 U=U_1\cup U_2\cup ···\cup U_n , 并 且 没 有 ,并且没有 U_i ⊆ U_J$, 1 ≤ i 1 ≤ i 1i j ≤ n j ≤ n jn F i F_i Fi F F F U i U_i Ui 上的投影。
💡可以看到R, U被分解成了若干个小部分。
相应地将 R R R存储在二维表 r r r中的数据分散到二维表 r 1 , r 2 , … , r n r_1,r_2,… , r_n r1r2,rn中去,其中 r i r_i ri r r r在属性集 U i U_i Ui上的投影。

模式分解三条准则

把低一级的关系模式分解为若干个高一级的关系模式并不是唯一的。在这些分解方法中,只有能够保证分解后的关系模式与原关系模式等价的方法才有意义,即模式分解三条准则

  • 分解具有无损连接性
  • 分解要保持原有的函数依赖
  • 分解既要保持函数依赖,又要具有无损连接性。

模式分解实例

还是以刚刚的关系模式 S − L ( S n o , S d e p t , S l o c ) S-L(Sno,Sdept,Sloc) SL(Sno,Sdept,Sloc)为例,显然该关系模式存在一系列问题:

image-20210321165234427
正确的模式分解

S − L S-L SL分解为二个关系模式:
N D ( S n o , S d e p t ) , S n o → S d e p t ND(Sno, Sdept),Sno→Sdept ND(Sno,Sdept),SnoSdept

D L ( S d e p t , S l o c ) , S d e p t → S l o c DL(Sdept, Sloc),Sdept→Sloc DL(Sdept,Sloc),SdeptSloc
这种分解不仅保持函数依赖性, 还具有无损连接性
💡用正常数据库开发的思维来考虑,也只能这样分。

错误的模式分解

应该来说除了刚刚提到的分解策略,其余都是错误的,归结一下错误分为以下几种:

  • 既不具有无损连接性,也未保持函数依赖。
    例如很极端的直接分解为3个关系模式 S N ( S n o ) , S D ( S d e p t ) , S O ( S l o c ) SN(Sno),SD(Sdept),SO(Sloc) SN(Sno),SD(Sdept),SO(Sloc)

  • 不具有无损连接性,但保持函数依赖。
    例如分解为 N L ( S n o , S l o c ) , D L ( S d e p t , S l o c ) NL(Sno, Sloc),DL(Sdept, Sloc) NL(Sno,Sloc),DL(Sdept,Sloc) N L NL NL D L DL DL自然连接的结果为

    image-20210322144422955

    N L ⋈ D L NL⋈DL NLDL比原来的 S − L S-L SL关系多了三个元组,则无法知道原来的 S − L S-L SL关系中究竟有哪些元组, 即此分解丢失了信息
    ⚠️IS和PH系宿舍楼都在B导致的。

  • 具有无损连接性,但未保持函数依赖。
    例如分解为 N D ( S n o , S d e p t ) , N L ( S n o , S l o c ) ND(Sno, Sdept),NL(Sno, Sloc) ND(Sno,Sdept),NL(Sno,Sloc),没有考虑原函数依赖 S d e p t → S l o c Sdept→Sloc SdeptSloc

这篇关于第一范式、第二范式、第三范式的区别(关系数据理论)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

闲置电脑也能活出第二春?鲁大师AiNAS让你动动手指就能轻松部署

对于大多数人而言,在这个“数据爆炸”的时代或多或少都遇到过存储告急的情况,这使得“存储焦虑”不再是个别现象,而将会是随着软件的不断臃肿而越来越普遍的情况。从不少手机厂商都开始将存储上限提升至1TB可以见得,我们似乎正处在互联网信息飞速增长的阶段,对于存储的需求也将会不断扩大。对于苹果用户而言,这一问题愈发严峻,毕竟512GB和1TB版本的iPhone可不是人人都消费得起的,因此成熟的外置存储方案开

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Collection List Set Map的区别和联系

Collection List Set Map的区别和联系 这些都代表了Java中的集合,这里主要从其元素是否有序,是否可重复来进行区别记忆,以便恰当地使用,当然还存在同步方面的差异,见上一篇相关文章。 有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否

javascript中break与continue的区别

在javascript中,break是结束整个循环,break下面的语句不再执行了 for(let i=1;i<=5;i++){if(i===3){break}document.write(i) } 上面的代码中,当i=1时,执行打印输出语句,当i=2时,执行打印输出语句,当i=3时,遇到break了,整个循环就结束了。 执行结果是12 continue语句是停止当前循环,返回从头开始。