数据库第六章总结

第六章 关系数据理论

6.1 问题的提出

关系模式由五部分组成,是一个五元组:
R(U, D, DOM, F)

R是符号化的元组语义

U为一组属性

D为属性组U中的属性所来自的域

DOM为属性到域的映射

F为属性组U上的一组数据依赖

D、DOM与模式设计关系不大,只用到三元组:R<U,F>

二维表每个分量必须是不可分开的数据项。

满足了这个条件的关系模式就属于:
第一范式(1NF)

数据依赖

是一个关系内部属性与属性之间的一种约束关系

  1. 通过属性间值的相等与否体现出来的数据间相互联系
  2. 是现实世界属性间相互联系的抽象
  3. 是数据内在的性质
  4. 是语义的体现

主要类型:函数依赖和多值依赖

在这里插入图片描述
假设学校教务的数据库模式用一个单一的关系模式Student来表示,则该关系模式的属性集合为:
U ={Sno, Sdept, Mname, Cno, Grade}
现实世界的已知事实(语义):
一个系有若干学生, 但一个学生只属于一个系;
一个系只有一名(正职)负责人;
一个学生可以选修多门课程,每门课程有若干学生选修;
每个学生学习每一门课程有一个成绩。

由此可得到属性组U上的一组函数依赖F:
F={Sno→Sdept, Sdept→ Mname, (Sno, Cno)→ Grade}

关系模式{Sno, Sdept, Mname, Cno, Grade}中存在的问题
(1)数据冗余
浪费大量的存储空间:每一个系主任的姓名重复出现
(2)更新异常(Update Anomalies)
更新数据时,维护代价大:某系更换系主任后,须修改有关的每一个元组。
(3)插入异常(Insertion Anomalies)
如果一个系刚成立,尚无学生,则无法把这个系及其系主任存入数据库。
(4)删除异常(Deletion Anomalies)
如果某个系的学生全部毕业了, 则在删除该系学生信息的同时,把这个系及其系主任的信息也丢掉了。

把这个单一的模式拆成三个关系模式:
S(Sno,Sdept,Sno → Sdept);
SC(Sno,Cno,Grade,(Sno,Cno) → Grade);
DEPT(Sdept,Mname,Sdept → Mname);
这三个模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制。

6.2.1 函数依赖

【定义6.1】
设R(U)是一个属性集U上的关系模式,X和Y是U的子集。对于R(U)的任意一个可能的关系r,r 中不可能存在:两个元组在X上的属性值相等,而在Y上的属性值不等, 称“X函数确定Y”或“Y函数依赖于X”,记作X→Y

在这里插入图片描述

X→Y,但Y⊈X则称X→Y是非平凡的函数依赖。
X→Y,但Y⊆X 则称X→Y是平凡的函数依赖。


若X→Y,则X称为这个函数依赖的决定因素

若X→Y,Y→X,则记作X←→Y。

若Y不函数依赖于X,则记作X↛Y。


【定义6.2 】
在R(U)中,如果X→Y,并且对于X的任何一个真子集X’, 都有 X’ ↛ Y, 则称Y对X完全函数依赖,记作X → Y。若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作X → Y。

[例] 在关系SC(Sno, Cno, Grade)中,有:
Sno ↛Grade,Cno ↛ Grade,
因此:(Sno, Cno) → Grade
(Sno, Cno)→Sno
(Sno, Cno) →Cno


【定义6.3 】
在R(U)中,如果X→Y(Y⊈X),Y↛X,Y→Z,Z⊈Y, 则称Z对X传递函数依赖(transitive functional dependency)。记为:X → Z。

[例] 在关系Std(Sno, Sdept, Mname)中,有:
Sno → Sdept,Sdept → Mname,
Mname传递函数依赖于Sno

6.2.2 码

【定义6.4 】
设K为R<U,F>中的属性或属性组合。若K → U,则K称为R的一个候选码(Candidate Key)。

如果U部分函数依赖于K,即K → U,则K称为超码 。
候选码是最小的超码,即K的任意真子集都不是候选码。

若关系模式R有多个候选码,则选定其中的一个做为主码(Primary key)。

主属性与非主属性
包含在任何一个候选码中的属性 ,称为主属性
不包含在任何码中的属性称为非主属性

整个属性组是码,称为全码(All-key)


[例6.2]S(Sno, Sdept, Sage),单个属性Sno是码
SC(Sno, Cno, Grade)中,(Sno, Cno)是码


[例6.3] R(P,W,A)
P:演奏者 W:作品 A:听众
一个演奏者可以演奏多个作品
某一作品可被多个演奏者演奏
听众可以欣赏不同演奏者的不同作品
码为(P,W,A),即All-Key


【定义6.5 】
关系模式 R中属性或属性组X 并非 R的码,但 X 是另一个关系模式的码,则称 X 是R 的外部码(Foreign key)也称外码

SC(Sno,Cno,Grade)中,Sno不是码
Sno是 S(Sno,Sdept,Sage)的码,则Sno是SC的外码

6.2.3 范式

范式是符合某一种级别的关系模式的集合。

第一范式(1NF)
第二范式(2NF)
第三范式(3NF)
BC范式(BCNF)
第四范式(4NF)
第五范式(5NF)

各种范式之间存在联系:
在这里插入图片描述

某一关系模式R为第n范式,可简记R∈nNF

一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
在这里插入图片描述

6.2.4 2NF

【定义6.6】 若关系模式R∈1NF,并且每一个非主属性完全函数依赖于任何一个候选码,则R∈2NF


[例6.4] S-L-C(Sno,Sdept,Sloc,Cno,Grade), Sloc为学生的住处,并且每个系的学生住在同一个地方。S-L-C的码为(Sno,Cno)。

函数依赖有
( S n o , C n o ) → F G r a d e (Sno,Cno) \overset {F} \rightarrow Grade (Sno,Cno)FGrade
S n o → S d e p t , Sno \rightarrow Sdept, SnoSdept, ( S n o , C n o ) → P S d e p t (Sno,Cno) \overset {P} \rightarrow Sdept (Sno,Cno)PSdept
S n o → S l o c , Sno→Sloc, SnoSloc, ( S n o , C n o ) → P S l o c (Sno,Cno) \overset {P} \rightarrow Sloc (Sno,Cno)PSloc
S d e p t → S l o c Sdept→Sloc SdeptSloc

非主属性Sdept、Sloc并不完全依赖于码
关系模式S-L-C不属于2NF


一个关系模式不属于2NF,会产生以下问题:
插入异常
删除异常
修改复杂

解决方法:
用投影分解把关系模式S-L-C分解成两个关系模式
SC(Sno,Cno,Grade)
S-L(Sno,Sdept,Sloc)


6.2.5 3NF

【定义6.7】 设关系模式R<U,F>∈1NF,若R中不存在这样的码X、属性组Y及非主属性Z(Y⊇ Z), 使得X→Y,Y→Z成立,Y ↛ X不成立,则称R<U,F> ∈ 3NF。

SC没有传递依赖,因此SC ∈ 3NF,S-L中Sno →Sdept( Sdept ↛ Sno), Sdept→Sloc,可得 S n o → 传 递 S l o c Sno \overset {传递} \rightarrow Sloc SnoSloc
解决的办法是将S-L分解成
S-D(Sno,Sdept)∈ 3NF
D-L(Sdept,Sloc)∈ 3NF


6.2.6 BCNF

通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。

【定义6.8】 设关系模式R<U,F>∈1NF,若X →Y且Y ⊆ X时X必含有码,R<U,F>∈BCNF。
换言之,在关系模式R<U,F>中,如果每一个决定属性集都包含候选码,则R∈BCNF。

[例6.5]考察关系模式C(Cno,Cname,Pcno)

  1. C只有一个码Cno,非主属性:Canme,Pcno。
  2. 没有非主属性对Cno部分依赖或传递依赖,所以C∈3NF。
  3. C中Cno是唯一的决定因素,所以C∈BCNF。

[例6.6] 关系模S(Sno,Sname,Sdept,Sage),
假定Sname具有唯一性

  1. S有两个候选码:Sno,Sname,非主属性:Sdept,Sage
  2. 非主属性不存在对码的传递依赖和部分依赖,所以S∈3NF。
  3. S中决定因素Sno,Sname包含码,所以S也属于BCNF。

[例6.7] 关系模式SJP(S,J,P)中,S是学生,J表示课程,P表示名次。每一个学生选修每门课程的成绩有一定的名次,每门课程中每一名次只有一个学生(即没有并列名次)。

由语义可得到函数依赖: (S,J)→P;(J,P)→S

  1. 候选码:(S,J),(J,P)。没有非主属性。
  2. 没有非主属性对码传递依赖或部分依赖,所SJP∈3NF。
  3. 除(S,J)与(J,P)以外没有其他决定因素,所以SJP∈BCNF。

[例6.8] 关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一教师只教一门课。每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。

由语义可得到函数依赖:(S,J)→T(S,T)→J;T→J

  1. 候选码:(S,J),(S,T);没有非主属性
  2. 因为没有非主属性对码传递依赖或部分依赖,STJ ∈ 3NF。
  3. 因为T是决定因素,而T不包含码,所以STJ ∈ BCNF。
    在这里插入图片描述
    非BCNF的关系模式也可以通过分解成为BCNF。
    例如STJ可分解为ST(S,T)与TJ(T,J),它们都是BCNF。

6.2.7 多值依赖

[例6.9]设学校中某一门课程由多个教师讲授,他们使用相同的一套参考书。每个教员可以讲授多门课程,每种参考书可以供多门课程使用。

【定义6.9】 设R(U)是属性集U上的一个关系模式。X,Y,Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。

平凡多值依赖和非平凡的多值依赖
若X→→Y,而Z=Ф,则称X→→Y为平凡的多值依赖。
否则称X→→Y为非平凡的多值依赖。

6.2.8 4NF

【定义6.10】 关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y ⊈ X),X都含有码,则R<U,F>∈4NF。

如果一个关系模式是4NF, 则必为BCNF。

闭包

闭包(记作X+ )就是由一个属性直接或间接推导出的所有属性的集合。

例如:
f={a->b,b->c,a->d,e->f};
由a可直接得到b和d,间接得到c,
则a的闭包就是{a,b,c,d}

对于给定的关系R(A1,A2,…An)和函数依赖集F,可将其属性分为4类:

L类 仅出现在函数依赖左部的属性。
R 类 仅出现在函数依赖右部的属性。
N 类 在函数依赖左右两边均未出现的属性。
LR类 在函数依赖左右两边均出现的属性。

定理:
对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类属性,则X必为R的任一候选码的成员。

推论:
对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类属性,且X+包含了R的全部属性;
则X必为R的唯一候选码。

定理:
对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类属性,则X必为R的任一候选码的成员。

推论:
对于给定的关系模式R及其函数依赖集F,
若X(X∈R)是L类属性,且X+包含了R的全部属性;
则X必为R的唯一候选码。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python编程快速上手是一本非常适合初学者的编程入门教材,本书总共分为16章,内容涵盖了Python的基础语法、常用数据结构、函数与模块、文件操作、异常处理等主题。这本书采用了简明扼要的语言和清晰的示例,使读者能够迅速掌握Python编程的基础知识。 首先,书中的第一章介绍了Python的基础知识,包括Python的起源和特点,如何安装Python以及如何使用Python解释器。接着,第二章讲解了Python的基本语法,包括变量、运算符、条件语句、循环语句等,这些是编程的基础,读者可以很快掌握。 然后,书中的第三章讲解了Python的数据结构,包括列表、元组、字典、集合等,这些数据结构在Python编程中非常重要。接下来,第四章介绍了Python的函数与模块,包括如何定义函数、如何使用内置函数以及如何导入和使用模块。 书中的第五和第六章讲解了文件的操作和异常处理,这些是编程中常用的技巧。此外,还有第七章介绍了正则表达式,第八和第九章介绍了网络编程和多线程编程,第十章介绍了数据库的操作,第十一章介绍了图形界面编程,第十二章介绍了Web开发,第十三章介绍了数据分析和机器学习,第十四章介绍了游戏开发,第十五章介绍了图像和声音处理,最后一章介绍了如何发布和分发自己的Python程序。 总之,Python编程快速上手这本书内容丰富全面,适合想要快速学习Python编程的初学者,通过阅读这本书,读者可以迅速掌握Python编程的基础知识,并能够在实际项目中灵活运用。同时,书中的示例丰富实用,对于加深编程理解和提升实践能力也非常有帮助。推荐给那些想要快速上手Python编程的读者。 ### 回答2: 《Python编程快速上手PDF》是一本适合初学者入门的Python编程书籍。Python作为一种简单易学的编程语言,被广泛应用于数据分析、Web开发、人工智能等领域。这本书的目的是帮助读者快速掌握Python的基本语法和常用库,从而能够快速编写简单的程序。 《Python编程快速上手PDF》首先介绍了Python的基本语法,包括变量、数据类型、运算符、控制流等内容。通过具体的示例代码,读者可以学习如何定义变量、执行基本运算以及使用条件语句和循环语句来控制程序流程。 接下来,本书引入了Python的常用库,如NumPy、Pandas、Matplotlib等。这些库提供了丰富的功能和工具,可以方便地进行数据分析、处理和可视化。通过学习这些库的用法,读者可以掌握如何使用Python进行数据处理和分析的基本方法。 此外,本书还介绍了如何使用Python进行Web开发、爬虫等应用。通过学习Django、Flask等Web框架的基本使用方法,读者可以了解如何搭建一个简单的Web应用。同时,本书还介绍了使用Python进行爬虫的基本原理和方法,读者可以学习如何爬取网页内容并进行数据提取和分析。 总之,《Python编程快速上手PDF》是一本帮助读者快速入门Python编程的实用书籍。通过学习本书的内容,读者可以快速掌握Python的基本语法和常用库的使用方法,从而能够使用Python编写简单的程序和进行一些基本的数据处理和分析。无论是初学者还是有一定编程基础的读者,都可以通过阅读本书快速掌握Python编程。 ### 回答3: 《Python编程快速上手.pdf》是一本针对初学者编写的Python编程入门书籍。本书主要以实际项目为例,介绍了Python编程的基础知识和常用技巧。 首先,本书从Python的基本概念开始介绍,如变量、数据类型、运算符等。然后,逐渐引入Python的控制结构,如条件语句、循环语句等,并配以简单易懂的示例代码,帮助读者理解和掌握这些概念。 接着,本书讲解了Python的函数、模块和文件操作等重要内容。通过学习函数的定义和调用,读者可以学会如何编写可重用的代码;通过了解模块的概念和引入,读者可以利用Python强大的标准库和第三方库进行更高级的功能实现;通过学习文件的读取和写入操作,读者可以处理各种文件格式并进行数据处理。 此外,本书还介绍了Python面向对象编程的基础知识,如类、对象、继承等。通过学习面向对象编程的思想,读者可以更好地组织和管理代码,并在实际项目中更好地实现功能。 最后,本书还涵盖了Python的一些高级主题,如异常处理、多线程、网络编程等。这些知识点将帮助读者更好地编写稳定、高效的Python程序。 总结来说,通过《Python编程快速上手.pdf》这本书,读者可以快速入门Python编程,并具备一定的编程能力。无论是对于初学者还是有一定编程经验的人来说,都是一本不可多得的编程学习资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摆烂.MVP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值