关系数据库设计规范化

文章目录

    • 基础知识
    • 规范化
      • 1NF(第一范式)
      • 2NF(第二范式)
      • 3NF(第三范式)
      • BCNF(Boyce Codd Normal Form,巴克斯范式)
      • 4NF(第四范式)
    • 模式分解
    • 总结

基础知识

关系数据库设计的目标是生成一组合适的、性能良好的关系模式,以減少系统中信息存储的冗余度,但又可方便地获取信息。

数据依赖是通过一个关系中属性间值的相等与否体现出来的数据间的相互关系,是现实世界属性间联系和约束的抽象,是数据内在的性质,是语义的体现。函数依赖则是一种最重要、最基本的数据依赖。

函数依赖:设R(U)是属性集U上的关系模式,X和Y是U的子集。若R(U)的任何一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的值不等,则称X函数决定Y或Y函数依赖于X,记作X->Y。

  • 如果X->Y,但 Y ⊊ X Y\subsetneq X YX,则称X->Y是非平凡的函数依赖。如(Sno,Cno)->Sno。
  • 如果X->Y,但 Y ⊆ X Y\subseteq X YX,则称X->Y是平凡的函数依赖。如(Sno,Cno)->Grade。

任何可能的关系:若X->Y,则X叫做决定因子;若X->Y,Y->X,则记做X<–>Y;若Y函数不依赖于X,则记作 X ≠ > Y X \neq> Y X=>Y

常见的函数依赖:

  • 完全函数依赖:在R(U)中,设X->Y,且对于X的任何一个真子集 X ′ X^{'} X,都有 X ′ X^{'} X不能决定Y,则称Y对X完全函数依赖。如(Sno,Cno)->Grade,但 S n o ≠ > G r a d e Sno \neq> Grade Sno=>Grade
  • 部分函数依赖:在R(U)中,设X->Y,但Y不完全依赖于X,则称Y对X部分函数依赖。
  • 传递函数依赖:在R(U,F)中,如果X->Y, Y ⊊ X , Y ≠ > X Y\subsetneq X,Y \neq> X YXY=>X,Y->Z,则称Z对X传递函数依赖。如Sno->Sdept、Sdept->Mname,则Sno->Mname。

多值函数依赖:在R(U,F)中,其属性集为U。X、Y、Z是U的子集,并且Z=U-X-Y。当且仅当对R(U)的任何一个关系r,给定一对(x,z)的值,这组值仅仅决定于x值而与z值无关,则称“Y多值依赖于X”或“X多值决定Y”,记X->->Y。

多值依赖具有6种性质

  • 具有对称性。若X->->Y,则X->->Z,其中Z=U-X-Y。
  • 传递性。若X->->Y,Y->->Z,则X->->Z-Y。
  • 函数依赖可以看成是多值依赖的特殊情况。
  • 若X->->Y,Y->->Z,则X->->YZ。
  • 若X->->Y,Y->->Z,则X->-> Y ∩ Z Y\cap Z YZ
  • 若X->->Y,Y->->Z,则X->->Z-Y。

Armstrong 公理系统:设关系模式R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有一下推理规则:

  • 自反律:若 Y ⊆ X ⊆ Z Y\subseteq X\subseteq Z YXZ,则X->Y为F所逻辑蕴含。
  • 增广率:若X->Y为F所逻辑蕴含,且 Z ⊆ U Z\subseteq U ZU,则XZ->YZ为F所逻辑蕴含。
  • 传递率:若X->Y和Y-Z为F所逻辑蕴含,则X->Z为F所逻辑蕴含。
  • 合并规则:若X->Y,X->Z,则X->YZ为F所蕴含。
  • 传递递率:若X->Y,WY->Z,则XW->Z为F所蕴含。
  • 分解规则:若X->Y, Z ⊆ Y Z\subseteq Y ZY,则X->Z为F所蕴含。

最小函数依赖集:如果函数依赖集F满足下列条件,则称F为一个最小函数依赖集,或极小哈书依赖集或最小覆盖。

  • F种任一函数依赖的右部仅有一个属性,即无多余的属性。
  • F种不存在这样的函数依赖X->A,使得F与 F − { X − A } F-\{X-A\} F{XA}等价,即无多余的函数依赖。
  • F种不存在这样的函数依赖X->A,X有真子集Z使得F与 F − { X − > A } ∪ { Z − > A } F-\{X->A\}\cup \{Z->A\} F{X>A}{Z>A},即去掉各函数依赖左边的多余属性。即不存在部分函数依赖。

函数闭包:在关系模式R(U,F)中被F逻辑蕴含的函数依赖的全体构成的集合称F闭包,记作 F + F^{+} F+

求候选码:用图解法确定候选码

  1. 将关系的函数依赖关系,用“有向图”的方式表示。
  2. 找出入度为0的属性,并以该属性集合为起点,尝试遍历有向图,若能正常遍历图中所有结点,则该属性集即为关系模式的候选键。
  3. 若入度为0的属性集不能遍历图中所有结点,则需要尝试性的将一些中间结点(既有入度,也有出度的结点)并入入度为0的属性集中,直至该集合能遍历所有结点,集合为候选键。

示例1:给定关系R(A1,A2,A3,A4)上的函数依赖集F={A1->A2,A2->A3,A3->A2,A2->A4},R的候选关键字为A1。

示例2:关系R(A,B,C)满足下列函数依赖:F{B->C,B->A,A->BC},关系R的候选键为A和B。

规范化

示例:First(Sno,Sname,Status,City,Pno,Qty),F={Sno->Sname,Sno->Status,Status->City,(Sno,Pno)->Qty}

1NF(第一范式)

若关系模式R中,每个数据项都是不可再分的,则称R属于第一范式,简称1NF,记作 R ∈ 1 N F R\in 1NF R1NF

1NF存在4个问题:

  • 冗余度大。部分列可进行再分,部分列代表的信息量大。
  • 引起修改操作的不一致性。由于部分列数据行数相同,进行更新会引起不一致。
  • 插入异常。主码不能取空值或部分为空值,当插入时会异常。
  • 删除异常。如果某个产品不销售了,删除后无法再找回该产品,但是该产品客观存在。

2NF(第二范式)

若关系模式 R ∈ 1 N F R\in 1NF R1NF,并且每一个非主属性都完全依赖于R的码,则称R属于第二范式,简称2NF,记作 R ∈ 2 N F R\in 2NF R2NF。也就是说,1NF基础上消除了非主属性对码的部分函数依赖。主要进行分解关系模式。如First关系分解为First1(Sno,Sname,Status,City)和First2(Sno,Pno,Qty)。

3NF(第三范式)

若关系模式R(U,F)中不存在这样的码X,属性组Y及非属性Z( Z ⊊ Y Z\subsetneq Y ZY)使得X->Y,(YKaTeX parse error: Undefined control sequence: \eq at position 1: \̲e̲q̲>X)Y->Z,则关系模式 R ∈ 3 N F R\in 3NF R3NF2NF基础上消除了非主属性对码的传递函数依赖,则称3NF。由于First1中有Sno->Status,Status->City存在传递,First1分解为First11(Sno,Sname,Status)和First12(Status,City)。

产生冗余和异常的两个重要原因是部分依赖和传递依赖。因为3NF模式中不存在非主属性对码的部分函数依赖和传递函数依赖,所以具有较好的性能。

BCNF(Boyce Codd Normal Form,巴克斯范式)

关系模式 R ∈ 1 N F R\in 1NF R1NF,若X->Y且 Y ⊊ X Y\subsetneq X YX时,X必含有码,则关系模式 R ∈ B C N F R\in BCNF RBCNF。也就是说,当3NF消除了主属性对码的部分函数依赖和传递函数依赖,则称为BCNF。

性质如下:

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

示例:设R(Pno,Pname,Mname)的属性分别表示零件号、零件名和厂商名,如果约定,每种零件号只有一个零件名,但不同的零件号可以有相同的零件名;每种零件可以有多个厂商生产,但每家厂商生产的零件应有不同的零件名。这样我们可以得到如下一组函数依赖:Pno->Pname,(Pname,Mname)->Pno。

该关系模式R的候选码为(Pname,Mname)或(Pno,Mname),属性都是主属性,不存在非主席对码的传递依赖,是3NF,但主属性传递依赖于码(Pname,Mname),不是BCNF,可以分解成R1(Pno,Pname)和R2(Mname)。

4NF(第四范式)

关系模式 R ∈ 1 N F R\in 1NF R1NF,若对于R的每个非平凡多值依赖X->->Y且 Y ⊊ X Y\subsetneq X YX时,X必含有码(不为空),则关系模式 R ( U , F ) ∈ 4 N F R(U,F)\in4NF R(U,F)4NF4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。如x、y、z,x–> y,z 为空集,则为平凡多值依赖,反之为非平凡多值依赖。

模式分解

分解:关系模式R(U,F)的一个分解 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},其中, U = ⋃ i = 1 n U i U=\bigcup\limits_{i=1}^nU_i U=i=1nUi,并且没有 U i ⊆ U j ( 1 ≤ i , j ≤ n ) U_i\subseteq U_j(1 \leq i ,j \leq n) UiUj(1i,jn) F i F_i Fi是F在 U i U_i Ui上的投影, F i = { X − > Y ∈ F + ∧ X Y ⊆ U i F_i=\{X->Y\in F_{+} \wedge XY \subseteq U_i Fi={X>YF+XYUi

分解成n个关系,分解的属性都要在子表中,并且子表没有交叉关系,

对一个给定的模式进行分解,使得分解后的模式是否与原来的模式等价有三种情况:

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

示例:关系模式Std(Sno,Sdept,Mname),其属性组上的函数依赖集是F={Sno->Sdept,Sdept->Mname}
a) R11(Sno,Mname)和R12(Sdept,Mname)
b) R21(Sno,Sdept)和R22(Sno,Mname)
c) R31(Sno,Sdept)和R32(Sdept,Mname)
d) R41(Sno)、R42(Sdept)和R43(Mname)

无损连接:关系模式R(U,F)分解为关系模式 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},如果对于R的每一个满足F的具体关系r,都有 r = π R 1 ( r ) × π R 2 ( r ) × . . . × π R n ( r ) r=\pi_{R_1}(r)\times\pi_{R_2}(r)\times... \times \pi_{R_n}(r) r=πR1(r)×πR2(r)×...×πRn(r),即r在 R 1 , R 2 , . . . R n R_1,R_2,...R_n R1,R2,...Rn上投影的自然连接等于r,则称分解 ρ \rho ρ具有无损连接。分解后的每个表合并后记录数和列不变,具有无损连接的充分必要条件 U 1 ∩ U 2 − > U 1 − U 2 ∈ F + 或 U 1 ∩ U 2 − > U 2 − U 1 ∈ F + U_1\cap U_2 -> U_1-U_2 \in F^{+}或U_1\cap U_2 -> U_2-U_1 \in F^{+} U1U2>U1U2F+U1U2>U2U1F+

保持函数依赖:关系模式R(U,F)分解为关系模式 ρ = { R 1 ( U 1 , F 1 ) , R 2 ( U 2 , F 2 ) , . . . , R n ( U n , F n ) } \rho=\{R_1(U_1,F_1),R_2(U_2,F_2),...,R_n(U_n,F_n)\} ρ={R1(U1,F1),R2(U2,F2),...,Rn(Un,Fn)},如果 F + = ( F 1 ⋃ F 2 ⋃ . . . ⋃ F n ) + F^{+}=(F_1\bigcup F_2\bigcup ... \bigcup F_n)^{+} F+=(F1F2...Fn)+,即F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖 F i F_i Fi逻辑蕴含,则称分解 ρ \rho ρ是保持函数依赖。

分解具有无损连接性和分解具有保持函数依赖是两个相互独立的标准。具有无损连接性的分解不一定保持函数依赖。保持函数依赖的分解也不一定具有无损连接性。

示例1:关系模式Std(Sno,Sdept,Mname),其属性组上的函数依赖集是F={Sno->Sdept,Sdept->Mname}

  • a) R11(Sno,Mname)和R12(Sdept,Mname)。 F 1 ⋃ F 2 = { S n o − > M n a m e , S d e p t − > M n a m e } F_1\bigcup F_2=\{Sno->Mname,Sdept->Mname\} F1F2={Sno>Mname,Sdept>Mname},无Sno->Mname,不保持函数依赖。
  • b) R21(Sno,Sdept)和R22(Sno,Mname) 。分析: U 1 ∩ U 2 = S n o → U 1 − U 2 = S d e p t U_1\cap U_2=Sno \rightarrow U_1-U_2=Sdept U1U2=SnoU1U2=Sdept,具有无损连接性。
  • c) R31(Sno,Sdept)和R32(Sdept,Mname)。分析: U 1 ∩ U 2 = S d e p t → U 2 − U 1 = M n a m e , U 1 − U 2 = S n o U_1\cap U_2=Sdept \rightarrow U_2-U_1=Mname,U_1-U_2=Sno U1U2=SdeptU2U1=MnameU1U2=Sno,具有无损连接性。 F 1 ⋃ F 2 = { S n o − > M n a m e , S d e p t − > M n a m e } F_1\bigcup F_2=\{Sno->Mname,Sdept->Mname\} F1F2={Sno>Mname,Sdept>Mname},都有,则保持函数依赖。
  • d) R41(Sno)、R42(Sdept)和R43(Mname)。

示例2:设关系模式R(U,F),其中U={A,B,C,D,E},F={A->BC,C->D,BC->E,E->A},则分解成 ρ = \rho= ρ={R1(ABCE),R2(CD)}满足具有无损连接和保持函数依赖。

分析: U 1 ∩ U 2 = C → U 1 − U 2 = A B E o r U 2 − U 1 = D U_1\cap U_2=C \rightarrow U_1-U_2=ABE or U_2-U_1=D U1U2=CU1U2=ABEorU2U1=D,具有无损连接性。F中的决定在分解的子表都存在。

总结

关系数据库设计的规范化是构建高效、可靠数据库系统的基础。它要求设计师深入理解并应用第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、Boyd-Codd范式(BCNF)以及第四范式(4NF)。这些范式旨在引导设计师逐步消除数据中的冗余和更新异常,从而确保数据的原子性、独立性和稳定性。

在规范化的过程中,模式或表的分解是一个核心环节。设计师需要通过模式分解来保持函数依赖和无损连接,这意味着在分解过程中既要确保数据不丢失,又要维持数据间的内在联系。这种精细的操作不仅有助于提高数据的访问效率,还能保证数据在不同表之间的一致性和完整性。

除了遵循规范化原则,数据库设计还需考虑性能优化和可扩展性。设计师应通过合理的索引策略、查询优化和适当的硬件配置来提升数据库的性能。同时,设计应具备灵活性,以便在未来能够适应业务需求的变化和技术的更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/21633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java面试题及答案2024,java2024最新面试题及答案(之一)

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 本套Java面试题大全&#xff0c;全的不能再全&#xff0c;哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Ja…

03_03_初识SpringAOP和应用

一、SpringAOP的初识与原理 1、概述 AOP&#xff1a;面向切面编程OOP&#xff1a;面向对象编程面相切面编程&#xff1a;是基于OOP基础之上的新编程思想&#xff0c;OOP面向的主要是对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;它在处理日志、安全管理、事务管…

D365 Project Operations

目录 D365包含哪些模块&#xff1f; D365 Project Operations是什么&#xff1f; D365 Project Operations优势 D365 Project Operations部署方案 总结 D365包含哪些模块&#xff1f; 微软的D365是一套功能强大的企业管理解决方案&#xff0c;其中包含了多种模块&#xff…

结账和反结账

结账与反结账功能在财务软件和会计系统中扮演着重要的角色&#xff0c;以下是关于这两个功能的详细解释&#xff1a; 一、结账功能 结账功能是计算和结转各个会计科目本期发生额和期末余额的过程&#xff0c;同时标志着一定时期内财务活动的结束和财务数据的固化。结账功能的…

深入React Hoooks:从基础到自定义 Hooks

使用 useContext useContext 是另一个常用的 Hook&#xff0c;它可让我们在函数组件中轻松访问 React 的 context。如果你的应用程序依赖于一些全局状态&#xff0c;或者你希望避免将 props 一层一层地传递到子组件&#xff0c;context 很有用。你可以在父组件设置一个值&…

C语言 链表经典OJ题

链表经典OJ题 移除链表元素链表的中间节点反转链表合并两个有序链表分割链表 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head […

mysql5.7血泪史

因为工作需要&#xff0c;需要将mysql8.0.33版本切换为mysql5.7系列。 在这个过程当中&#xff0c;首先我将mysql8卸载干净。 mysql彻底卸载干净的5个步骤&#xff0c;超多图超详细保姆级教程最新教程新手小白轻松上手_卸载mysql-CSDN博客 然后发现mysql5.7在官网上下载很…

python小练习03

1.绘制奥运五环旗 #奥运五环的绘制 import turtle as t t.pensize(3) t.speed(0) def draw_circles():i0while i <4:args [[-60,0,"blue"],[0,0,"black"],[60,0,"red"],[-30,-30,"yellow"],[30,-30,"green"]]#定义一个…

lua vm 二: 查看字节码、看懂字节码

本文讲一讲如何查看 lua 的字节码&#xff08;bytecode&#xff09;&#xff0c;以及如何看懂字节码。 以下分析基于 lua-5.4.6&#xff0c;下载地址&#xff1a;https://lua.org/ftp/ 。 1. 查看字节码 1.1 方法一&#xff1a;使用 luac luac 是 lua 自带的编译程序&#x…

CF Round 368 (Div. 2) C. Pythagorean Triples【数学 构造】

Codeforces Round 368 (Div. 2) C. Pythagorean Triples 题意&#xff1a; 给你一个整数n&#xff0c;让你构造另两个整数满足三角形的勾股定理。 思路&#xff1a; 首先&#xff0c;n < 2无解 由题意得&#xff1a;a^2 b^2 c^2&#xff1b;不妨设n a&#xff0c;则…

【AIGC半月报】AIGC大模型启元:2024.06(上)

AIGC大模型启元&#xff1a;2024.06&#xff08;上&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; (1) ChatTTS&#xff08;语音合成项目&#xff09; 2024.06.01 ChatTTS 文本转语音项目爆火出圈&#xff0c;引来大家极大的关注。短短三天时间&#xff0c;在…

MySQL(三) - 基础操作

一、索引 由于我们在使用数据库的时候&#xff0c;大部分操作的都是查询操作&#xff0c;但是我们每一次进行查询都需要遍历一遍表中所有数据&#xff0c;这会花费O(n)的时间&#xff0c;因此数据引入了“索引” 也就是在底层使用了数据结构来进行优化查询的操作&#xff0c;但…

【TB作品】MSP430F149单片机,广告牌,滚动显示

LCD1602滚动显示切换播放暂停字符串 显示Public Places 显示No Smoking 播放 暂停 部分代码 char zifu1[] "Public Places "; char zifu2[] "Class Now "; char zifu3[] "No admittance "; char *zifu[] { zifu1, zifu2, zifu3 }…

优思学院|客户质量工程师CQE岗位的未来发展,你怎么看?

在现代工业的发展背景下&#xff0c;客户质量工程师&#xff08;CQE&#xff09;正逐渐成为企业质量管理体系中的关键角色。随着全球化和数字化的不断推进&#xff0c;CQE的职责不仅限于传统的质量控制&#xff0c;更包括了质量管理体系的设计和优化、客户关系的管理、以及在整…

Flutter 中的 ToggleButtonsTheme 小部件:全面指南

Flutter 中的 ToggleButtonsTheme 小部件&#xff1a;全面指南 Flutter&#xff0c;作为由 Google 开发的跨平台 UI 框架&#xff0c;为开发者提供了丰富的组件来构建现代化的应用程序。ToggleButtons 是 Material Design 组件库中的一个组件&#xff0c;它允许用户从一组选项…

AI的绘画工具有哪些?

AI绘画工具利用人工智能技术帮助用户生成艺术作品或进行图像编辑&#xff0c;以下是一些AI绘画工具的列表&#xff1a; 1. 腾讯智影AI绘画&#xff1a;提供在线智能绘画工具&#xff0c;用户可以通过输入关键词和选择不同的效果预设来生成艺术作品。 2. Stylar&#xff1a;一…

【UML用户指南】-06-面向对象建模-关系(relationship)

目录 1、面向对象建模常见的关系 2、关系的组成元素 3、依赖关系 4、泛化关系 5、关联关系 关联的四种修饰 1.名称 2.角色 3.多重性 4.聚合 6、常用建模技术 6.1、对简单依赖建模 6.2、对单继承建模 6.3、对结构关系建模 1、面向对象建模常见的关系 依赖 &#x…

遍历数组1

package demo; import java.util.ArrayList; public class Arrilist { public static void main(String[] args) { ArrayList<String>listnew ArrayList<>(); list.add("汤神"); list.add("yyx"); list.add("hong go…

pyqt绘制各种直线

pyqt绘制各种直线 介绍效果代码 介绍 使用pyqt绘制各种直线 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QPainter, QPen, QPainterPath, QColor, QBrush from PyQt5.QtCore import Qt, QPoint, QLineF, QPointFclass…

JVM 指针压缩

运用java内存对齐填充&#xff0c;对java内存进行8字节划分&#xff0c;java对象指针映射到每个划分区域上&#xff0c;使得4个字节&#xff08;32位&#xff09;表示2^32个地址&#xff0c;从而使4个字节指针映射32G内存空间。 1.为什么进行指针压缩&#xff1a; jvm从32位变…