数据库原理及应用·关系数据库设计理论

5.1 数据依赖

5.1.1 关系模式中的函数依赖

函数依赖的概念:设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时,则它们的Y属性值也相同,则称X函数决定Y,或Y函数依赖于X,记为X→Y。

函数依赖分为平凡函数依赖,非平凡函数依赖,完全函数依赖,部分函数依赖,传递函数依赖。

平凡函数依赖:当关系中属性集合Y是属性集合X的子集时(Y⊆X),存在函数依赖X→Y,即一组属性函数决定它的所有子集,这种函数依赖称为平凡函数依赖。

非平凡函数依赖:当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,则称这种函数依赖为非平凡函数依赖。

完全函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,但Y不函数依赖于X 的任何真子集,则称Y完全函数依赖于X。

部分函数依赖:设X,Y是关系R的两个属性集合,存在X→Y,若X'是X的真子集,存在X'→Y,则称Y部分函数依赖于X。

传递函数依赖:设X,Y,Z是关系R中互不相同的属性集合,存在X→Y,X不函数依赖于Y,Y→Z,则称Z传递函数依赖于X。

假设有如下学生选课关系模式:R(学号,姓名,课程号,课程名,成绩,院系号,院系名),其中(学号,课程号)为主码,则存在如下函数依赖:

(学号)→(姓名)  非平凡函数依赖

(学号,姓名)→(姓名)  平凡函数依赖

(学号,课程号)→(成绩) 完全函数依赖

(学号,课程号)→(课程名) 部分函数依赖,课程名只依赖于课程号

(学号)→(院系名) 传递函数依赖,(学号)→(院系号),(院系号)→(院系名)

5.1.2 函数依赖对关系模式的影响

假设有如下学生关系模式:R(学号,姓名,课程号,课程名,成绩),其中(学号,课程号)为主码。(学号,课程号)→(成绩),(学号)→(姓名),(课程号)→(课程名)。

这个关系模式有部分函数依赖,存在4个问题:

数据冗余太大: 每一个学生姓名重复出现,重复次数与该学生所选课程数相同;每一门课程名重复出现,重复次数与选修该课程的学生数相同,这将消耗不必要的存储空间。

更新异常: 学生修改姓名或课程修改课程名后,必须修改系统中所有选课有关的元组,如果某一个元组没有被修改,将会导致数据不一致。

插入异常: 如果新开一门课程,还没有学生选,就无法把这个课程的信息存入数据库。

删除异常:  如果学生全部毕业了,在删除学生信息的同时,把课程信息也丢掉了。

如将上面的关系模式分解为R1(学号,姓名)、R2(课程号,课程名), R3(学号,课程号,成绩)就不会出现上面的问题了。

假设有如下学生关系模式:R(学号,姓名,院系号,院系名,办公地),其中(学号)为主码。(学号)→(姓名,院系号),(院系号)→(院系名,办公地)。这个关系模式有传递函数依赖,存在4个问题:

数据冗余太大: 每一个院系名和办公地重复出现,重复次数与该系所有学生数相同,这将消耗不必要的存储空间。

更新异常: 某院系更换办公地后,系统必须修改与该院系学生有关的每一个元组,如果某一个元组没有被更换,将会导致数据不一致。

插入异常: 如果一个院系刚成立,没有学生,就无法把这个院系的信息存入数据库。

删除异常: 如果某个系的学生全部毕业了,在删除该系最后一个学生信息的同时,把这个院系的信息也丢掉了。

如将上面的关系模式分解为R1(学号,姓名,院系号)和R2(院系号,院系名,办公地)就不会出现上面的问题了。

因此,含有部分函数依赖传递函数依赖的关系模式不是一个好的模式。规范化理论正是用来改造关系模式,通过分解关系模式来消除其中不合适的数据依赖,以解决插入异常、删除异常、更新异常和数据冗余问题。

5.2 范式

5.2.1 第一范式(1NF)

第一范式是指一个关系模式的所有属性都是不可分的基本数据项。

关系模式R(学号,姓名,获奖),其中(学号)是主码,R不满足第一范式,因为一个学生可能获得多个奖项。为了使R满足第一范式,有两种处理方式:

①如果知道一个学生的获奖不超过3项,可以分解为R(学号,姓名,获奖1,获奖2,获奖3)。这种处理方式使得R满足第一范式,但当大部分学生获奖较少时,数据库中将产生大量的空值,同时可扩展性较差。

②将R分解为R1(学号,姓名)和R2(学号,获奖)两个关系模式。R1中(学号)作主码,R2中(学号)为外码,R2中(学号,获奖)作主码,这样避免了方式①的缺陷并使得R1和R2均满足第一范式。

5.2.2 第二范式(2NF)

如果一个关系模式满足第一范式,并且每个非主属性完全函数依赖于码,则称其满足第二范式。

关系模式R(学号,课程号 ,姓名,课程名,成绩),R满足第一范式,但不满足第二范式,因为(学号)→(姓名),(课程号)→(课程名),(学号,课程号)→(成绩)。

分解为三个关系模式:

R1(学号,姓名) (学号)为主码

R2(课程号,课程名) (课程号)为主码

R3(学号,课程号,成绩) (学号,课程号)为主码

上面三个关系模式均满足第二范式。

5.2.3 第三范式(3NF)

如果关系模式满足第二范式,并且不存在非主属性传递依赖于码,则称其满足第三范式。简而言之,第三范式就是属性不依赖于其它非主属性。

关系模式R(学号,姓名,院系号,院系名),R满足第二范式,但不满足第三范式,因为(学号)→(院系号),(院系号)→(院系名)。

分解为两个关系模式:

R1(学号,姓名,院系号) (学号)为主码

R2(院系号,院系名) (院系号)为主码

上面两个关系模式均满足第三范式。

5.2.4 BC范式

如果关系模式满足第三范式,并且不存在主属性对非所在码(不包含本主属性的码)的传递依赖和部分依赖,则称其满足BC范式。

设有一个仓库管理关系模式R(仓库号,物品号,管理员号,数量)。 (仓库号,物品号)和(物品号,管理员号)均为候选码,上面关系是满足第三范式的,但不满足BCNF范式,因为(管理员号)→(仓库号)。

分解为两个关系模式:

R1(仓库号,物品号,数量) (仓库号,物品号)为主码

R2(仓库号,管理员号) (管理员号)为主码

上面两个关系模式均满足BCNF范式。

5.3 规范化与反规范化

5.3.1 关系模式的规范化

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

规范化的步骤:
①对1NF关系进行投影,消除原关系中非主属性对码的函数依赖,将1NF关系转换为若干个2NF关系。
②对2NF关系进行投影,消除原关系中非主属性对码的传递函数依赖,从而产生一组3NF关系。
③对3NF关系进行投影,消除原关系中主属性对码的部分函数依赖和传递函数依赖,得到一组BCNF关系。
以上三步也可以合并为一步:对原关系进行投影,消除决定属性不是侯选码的任何函数依赖。

5.3.2 关系模式的反规范化

关系型数据库规范化的目标是减少冗余和提高表设计的灵活性,但同时也增加了在查询数据连接查询的难度。

如果系统对查询的频率和性能要求很高,那么就不得不在效率和冗余上权衡,得到一个折中的解决方法。而折中的方式就是引入受控冗余来降低规范化程度。

在关系型数据库中,反规范化是指在数据库规范化后,为了提高数据检索性能,在某些局部降低规范化标准,引入适当的冗余的方法。

反规范化数据库不应该和从未进行过规范化的数据库相混淆,反规范化引入的冗余是一种受控的冗余。

反规范化常用的方法是合并1:1联系的表,合并1:n联系的表,复制1:n联系1端表中数据到n端,复制m:n联系中m端和n端数据到新产生的联系表中。

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

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

相关文章

分割时间方法

输入开始时间和结束时间以及时间间隔, 并以数组形式输出其中的时间段 const generateTimeSlots (startHour: number, endHour: number, intervalMinutes: number) > {const slots [];let currentTime new Date().setHours(startHour, 0, 0, 0);const endTime…

redis—String字符串

目录 前言 1.字符串数据类型 2.常见命令 3.典型应用场景 前言 字符串类型是Redis最基础的数据类型,关于字符串需要特别注意: 1)首先Redis中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础.上构建的,例如列表…

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作!

【2024 行人重识别最新进展】ReID3D:首个关注激光雷达行人 ReID 的工作! 摘要:数据集:方法模型:多任务预训练:ReID Network: 实验结果:结论: 来源:Arxiv 2023…

图像分割算法

(车载)毫米波雷达的静止“目标”滤除问题 https://blog.csdn.net/xhblair/article/details/130849777 车载与体征/手势检测 毫米波雷达信号处理流程 csdn链接 专利-一种基于FPGA的步进频高分辨近程雷达探测系统和方法与流程 https://www.xjishu.com/zhuanli/52/2022114681…

drf知识--05

两个视图基类 # APIView:之前一直在用---》drf提供的最顶层的父类---》以后所有视图类,都继承自它 # GenericAPIView:继承自APIView--》封装 继承APIView序列化类Response写接口 # urls.py--总路由 from django.contrib import admin from dj…

ElasticSearch 使用映射定义索引结构

动态映射 dynamic 可选值解释true默认值,启用动态映射,新增的字段会添加到映射中runtime查询时动态添加到映射中false禁用动态映射,忽略未知字段strict发现未知字段,抛出异常 显示映射 创建映射 PUT user {"mappings&qu…

Elasticsearch可视化平台Kibana [ES系列] - 第498篇

历史文章(文章累计490) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 全…

three.js后处理(发光描边OutlinePass描边样式

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"></div>&…

圆通速递查询,圆通速递单号查询,对需要的单号记录进行标记

随着网购的普及&#xff0c;快递服务已经深入到我们生活的方方面面,我们每天都需要处理大量的快递信息,为了更高效地管理这些信息&#xff0c;【快递批量查询高手】应运而生。 所需工具&#xff1a; 一个【快递批量查询高手】软件 圆通速递单号若干 操作步骤&#xff1a; …

不同参数规模大语言模型在不同微调方法下所需要的显存总结

原文来自DataLearnerAI官方网站&#xff1a; 不同参数规模大语言模型在不同微调方法下所需要的显存总结 | 数据学习者官方网站(Datalearner)https://www.datalearner.com/blog/1051703254378255 大模型的微调是当前很多人都在做的事情。微调可以让大语言模型适应特定领域的任…

【Qt-发布】

Qt编程指南 ■ Qt版本发布■■■ ■ Qt版本发布 生成Release版本。LordCard.exe.查看windeployqt.exe所在目录。 E:\install\Qt\Qt5.14.2\5.14.2\mingw73_64\bin\windeployqt.exe 如果已经将这个路径设置到环境变量中了&#xff0c;那么在当前操作系统的任意目录下都可以访问 …

【华为OD题库-105】滑动窗口最大值-java

题目 题目描述: 有一个N个整数的数组&#xff0c;和一个长度为M的窗口&#xff0c;窗口从数组内的第一个数开始滑动直到窗口不能滑动为止&#xff0c;每次窗口滑动产生一个窗口和&#xff08;窗口内所有数的和)&#xff0c;求窗口滑动产生的所有窗口和的最大值。 输入描述: 第一…

口算练习题(字符串处理)#洛谷

题目描述 王老师正在教简单算术运算。细心的王老师收集了i道学生经常做错的口算题&#xff0c;并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情&#xff0c;为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量&#xff0c;比如 58 \texttt{58} 5…

IntelliJ IDEA快捷键及调试

文章目录 一、IntelliJ IDEA 常用快捷键一览表1-IDEA的日常快捷键第1组&#xff1a;通用型第2组&#xff1a;提高编写速度&#xff08;上&#xff09;第3组&#xff1a;提高编写速度&#xff08;下&#xff09;第4组&#xff1a;类结构、查找和查看源码第5组&#xff1a;查找、…

05|提示工程(下):用思维链和思维树提升模型思考质量 ## 什么是 Chain of Thought

05&#xff5c;提示工程&#xff08;下&#xff09;&#xff1a;用思维链和思维树提升模型思考质量 什么是 Chain of Thought CoT 这个概念来源于学术界&#xff0c;是谷歌大脑的 Jason Wei 等人于 2022 年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large La…

R-列表、矩阵、数组转化为向量

目录 一、c()函数 二、unlist()函数 一、c()函数 c()&#xff1a;对应的英文是combine. 当你使用c()函数时&#xff0c;它会将输入的对象连接成一个向量。因此&#xff0c;无论输入是矩阵、数组还是列表&#xff0c;c()函数都会将它们连接成一个简单的向量。因此&#xff…

Linux操作系统—磁盘和文件系统管理实用

1. 硬盘和分区基础&#xff1a; - Linux使用设备文件&#xff08;例如 /dev/sda&#xff09;来表示硬盘。 - 使用fdisk或parted等工具对硬盘进行分区。 # 示例&#xff1a;使用fdisk进行分区 sudo fdisk /dev/sda 2. 查看磁盘信息&#xff1a; - 使用lsblk或fdisk查看系统…

k8s修改/etc/resolve.conf导致容器域名解析失败

问题&#xff1a; 因为用户原因&#xff0c;修改了k8s主机中/etc/resolve.conf的dns地址&#xff0c;产生的现象就是主机可以解析域名&#xff0c;但是pod不能解析域名; 原因&#xff1a; CoreDNS 是 Kubernetes 集群中的默认 DNS 服务器&#xff0c;负责处理集群内的 DNS 解…

使用代码生成工具快速开发应用-结合后端Web API提供接口和前端页面快速生成,实现通用的业务编码规则管理

1、通用的业务编码规则的管理功能 在前面随笔我们介绍了一个通用的业务编码规则的管理功能&#xff0c;通过代码生成工具Database2Sharp一步步的生成相关的后端和Winform、WPF的界面&#xff0c;进行了整合&#xff0c;通过利用代码生成工具Database2sharp生成节省了常规功能的…

DreamTuner :通过单张图片实现主题驱动的图像生成

该项目由字节跳动开发&#xff0c;你只需要提供一张图片&#xff0c;DreamTuner就能帮你生成与这张图片在主题和风格上一致的新图像。比如你有一张可乐照片&#xff0c;它可以根据你的要求将可乐放在任何场景中或添加其他元素形成一张完美海报&#xff01; 这个工具特别适用于需…