数据库原理与应用笔记(六):关系数据理论

简介: 关系数据理论


6.1问题的提出

什么问题的提出?

前面的章节讨论了数据库系统的一般概念,介绍了关系数据库的基本概念、关系模型三部分以及关系数据库的标准语言SQL,但是还有一个最基本的问题没有提及:针对一个具体问题,应该如何构造一个适合它的数据库模式,即应该构造几个关系模式,每个关系由哪些属性组成等。这是数据库设计的问题,确切地讲是关系数据库逻辑设计问题。


由于关系模型有严格的数学理论基础,并且可以向别的数据模型转换,所以人们就以关系模型为背景来讨论这个问题,形成了数据库逻辑设计的一个有力工具——关系数据库的规范化理论


在笔记二中,我们叙述过一个关系模式应该是五元组,即

R(U,D,DOM,F)

关系名R是符号化的元组语义
U为一组属性
D为属性组U中的属性所来自的域
DOM为属性到域的映射
F为属性组U上的一组数据依赖


由于D、DOM与模式设计关系不大,所以本章把关系模式看成一个三元组即

R<U,F>

当且仅当U上的一个关系r满足F时,r称为关系模式R<U,F>的一个关系

第一范式是什么?

每个分量必须是不可分的数据项,满足这个条件的关系模式就属于第一范式(1NF)


在这里先说一下非形式下数据依赖的概念

数据依赖是一个关系内部属性与属性之间的一种约束关系。这种约束关系是通过属性间值的想等与否体现出来的数据间的相关联系。它是现实世界属性相互联系的抽象,是数据内在的性质,是语义的体现。


数据依赖中最重要的是函数依赖Functional Dependency多值依赖Multi-Valued Dependency


函数依赖是什么呢?

简单来说某一个函数决定了另一个函数,比如一个学号决定了某个学生名字,类似数学中的函数y=f(x)般,即Sname=f(Sno),这样的依赖就称作函数依赖,即Sno函数决定Sname函数,Sname函数依赖于Sno


在不规范的数据库中,常常出现以下几个问题:

数据冗余:比如数据库中每一个职员都对应一个相同的boss,则boss的资料出现的太频繁,浪费了太多的空间

更新异常:比如更新数据库中一个boss的资料时,需要把下属的资料一起更改

插入异常:一个公司刚刚成立,没有职工,则无法把boss信息存入数据库,因为boss对应着某些职工的信息

删除异常:在删除职工的信息时把boss的信息也删除了


综上,一个好的模式应当不会发生插入异常、删除异常和更新异常、数据冗余应尽可能少

接下来我们来讨论怎么样能够使数据库模式变得更好,即规范化问题

6.2规范化

6.2.1函数依赖

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


其实这个很好理解,即上面的说的学号和姓名的关系(比如这个就是关系r),如果学号X确定了,则在任何元组中,姓名Y都是固定的,则称学号确定姓名或姓名依赖于学号,学号→姓名

函数依赖和别的数据依赖一样是语义范畴的概念,只能根据语义来确定一个函数依赖


比如姓名→年龄这个函数依赖只有在该部门没有同名人的条件下成立,如果允许有同名人则依赖失效了

有关的一些术语和记号:2020062417030815.png

对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。若不特别声明,总是讨论非平凡的函数依赖。

20200624170446355 (1).png下面的完全函数依赖,部分函数依赖和传递函数依赖的定义

20200624170606787.png

简单来说,完全函数依赖就是一个非主属性完全依赖于一个候选码,比如在一个学号,课程号,系别,成绩的属性组中,候选码是学号和课程号,成绩是由学号和课程号共同决定得出的,而系别只要学号就可以确定了,则成绩就是完全依赖,系别就是部分依赖

20200624170642782.png

如有看概念和例子对以上依赖不明白的同学可以私聊滴滴作者。

6.2.2码

20200624171307670.png

2020062417140924.png

关于码的概念还是比较抽象的,笔者在这里进行理解性的叙述一下

首先什么是候选码,候选码首先是一个属性或一个属性组,其次是可以决定一个属性,比如学号能决定姓名,学号就是候选码,学号和课程号可以决定某个课程的成绩(通过学号可以知道姓名,通过姓名+课程号可以知道成绩)则学号和课程号这个属性组合也是候选码

有多个候选码就选一个作为主码

在候选码中的属性就被称为主属性,没有在候选码中的属性就称为非主属性,比如上面的例子中,学号和课程号就是主属性,成绩就是非主属性

全码就是整个属性组都是候选码,谁都可以决定谁,这样的就是全码,也称all key。


定义:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码foreign key,也称外码


这个在前面的笔记中有过举例,这里不再叙述

6.2.3范式

关系数据库中的关系是要满足一定要求的,满足不同程度要求的为不同范式。满足最低要求的叫做第一范式,简称1NF,以此类推

各种范式之间的关系有

5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF


可以这样理解,1NF是粗糙的石头,打磨分解后就变的光滑就2NF


即:一个低一级范式的关系模式通过模式分解schema decomposition可以转换成若干个高一级范式的关系模式的集合,这种过程就叫规范化normalization

6.2.4 2NF

定义:若R∈1NF,且每一个非主属性完成函数依赖于任何一个候选码,则R∈2NF

即消除了非主属性对码的部分函数依赖

6.2.5 3NF


20200624173941478.png

6.2.6 BCNF

通常认为BCNF是修正的第三范式,或者扩充的第三范式

2020062417461853.png

由BCNF的定义可以得出结论,一个满足BCNF的关系模式有:

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

即消除了主属性对码的部分和传递依赖

注意是主属性,2NF和3NF是非主属性


即,每一个关系中,只有一个决定因素。不要这个主属性可以决定另一个主属性,比如在学生,教师,课程的关系中,学生和老师可以决定上的是哪一门课程,学生和课程可以决定是哪一个老师上课,这样的话,老师算不算决定因素?课程算不算决定因素?即BCNF要消除这个依赖。

20200624175824209.png

6.2.7多值依赖

20200624175911726.png

20200624175938198.png

20200624180016642.png

多值依赖简单来举个例子就是,有一个关系r中有{学科x,学科对应的书籍z}还有一个值是老师y,这个老师y仅仅取决于这个学科x,而与z值无关,这样的就是多值依赖


多值依赖具有以下性质:

①多值依赖具有对称性。即若X→→Y,则X→→Z,其中Z=U-X-Y

②多值依赖具有传递性。即若X→→Y,Y→→Z,则X→→Z

③函数依赖可以看作是多值依赖的特殊情况,即若X→Y,则X→→Y

④若X→→Y,X→→Z,则X→→YZ

⑤若X→→Y,X→→Z,则X→→Y∩Z

⑥若X→→Y,X→→Z,则X→→Y-Z,X→→Z-Y


多值依赖与函数依赖相比具有两个基本的区别

(1)多值依赖的有效性与属性集的范围有关
(2)若函数依赖X→Y在R(U)上成立,则对于任何Y’⊂Y均有X→Y’成立。而多值依赖X→→Y若在R(U)上成立,却不能断言对于仍和Y’⊂Y有X→→Y’成立

6.2.8 4NF

2020062418102657.png

即消除非平凡且非函数依赖的多值依赖
换句话说
都是平凡的函数依赖的多值依赖

6.2.9规范化小结

规范化实质上的概念的单一化

20200624181203988.png


相关实践学习
体验RDS通用云盘核心能力
本次实验任务是创建一个云数据库RDS MySQL(通用云盘),并通过云服务器ECS对RDS MySQL实例进行压测,体验IO加速和IO突发带来的性能提升;并通过DMS执行DDL,将数据归档到OSS,再结合云盘缩容,体验数据归档带来的成本优势。
相关文章
|
2月前
|
存储 监控 数据处理
flink 向doris 数据库写入数据时出现背压如何排查?
本文介绍了如何确定和解决Flink任务向Doris数据库写入数据时遇到的背压问题。首先通过Flink Web UI和性能指标监控识别背压,然后从Doris数据库性能、网络连接稳定性、Flink任务数据处理逻辑及资源配置等方面排查原因,并通过分析相关日志进一步定位问题。
187 61
|
2天前
|
SQL 存储 运维
从建模到运维:联犀如何完美融入时序数据库 TDengine 实现物联网数据流畅管理
本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品。文章从一个具体的业务场景出发,分析了企业在面对海量时序数据时的挑战,并提出了利用 TDengine 高效处理和存储数据的方法,帮助企业解决在数据采集、存储、分析等方面的痛点。通过这篇文章,作者不仅展示了自己对数据处理技术的理解,还进一步阐释了时序数据库在行业中的潜力与应用价值,为读者提供了很多实际的操作思路和技术选型的参考。
16 1
|
7天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
10天前
|
前端开发 JavaScript 数据库
获取数据库中字段的数据作为下拉框选项
获取数据库中字段的数据作为下拉框选项
39 5
|
11天前
|
人工智能 容灾 关系型数据库
【AI应用启航workshop】构建高可用数据库、拥抱AI智能问数
12月25日(周三)14:00-16:30参与线上闭门会,阿里云诚邀您一同开启AI应用实践之旅!
|
2月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
2月前
|
存储 缓存 网络安全
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
|
2月前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
2月前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
11天前
|
存储 Oracle 关系型数据库
数据库传奇:MySQL创世之父的两千金My、Maria
《数据库传奇:MySQL创世之父的两千金My、Maria》介绍了MySQL的发展历程及其分支MariaDB。MySQL由Michael Widenius等人于1994年创建,现归Oracle所有,广泛应用于阿里巴巴、腾讯等企业。2009年,Widenius因担心Oracle收购影响MySQL的开源性,创建了MariaDB,提供额外功能和改进。维基百科、Google等已逐步替换为MariaDB,以确保更好的性能和社区支持。掌握MariaDB作为备用方案,对未来发展至关重要。
38 3