关系数据库设计理论

news2025/1/19 14:20:44

关系数据库设计理论

目录

  • 关系数据库设计理论
  • 是什么
  • 函数依赖
    • 完全函数依赖(Full Functional Dependency)
    • 部分函数依赖(Partial Functional Dependency)
    • 传递函数依赖(Transitive Functional Dependency)
  • 异常
    • 插入异常(Insertion Anomaly)
    • 更新异常(Update Anomaly)
    • 删除异常(Deletion Anomaly)
    • 实例
  • 范式
    • 第一范式(1NF)
    • 第二范式(2NF)
    • 第三范式(3NF)
    • 第四范式(4NF)
    • 实例
  • 总结

在这里插入图片描述

是什么

关系数据库设计理论是指在设计关系数据库时所需要遵循的一系列规则和原则。这些规则和原则有助于确保数据库的结构合理、数据完整性和一致性得到保证,使得数据可以被高效地存储、检索和管理。

函数依赖

函数依赖是关系数据库设计中的一个基本概念,它是指在一个关系中,一个属性或者属性组的取值决定了另一个属性或者属性组的取值。函数依赖通常用X → Y表示,其中X是决定Y的属性集合,Y是被决定的属性集合。

记 A->B 表示 A 函数决定 B,也可以说 B 函数依赖于 A。

如果 {A1,A2,… ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。

对于 A->B,如果能找到 A 的真子集 A’,使得 A’-> B,那么 A->B 就是部分函数依赖,否则就是完全函数依赖。

对于 A->B,B->C,则 A->C 是一个传递函数依赖。

  • 合并律:由X→Y,X→Z,有X→YZ
  • 伪传递律:X→Y,WY→Z,有WX→Z
  • 分解律:由X→Y及Z∈Y,有X→Z

完全函数依赖(Full Functional Dependency)

完全函数依赖是指在一个关系中,X对Y的决定是最小的,也就是说,如果去掉X中的任何一个属性,Y的值都会发生改变。例如,学生的学号决定了他的姓名和性别,如果去掉学号中的任何一个数字,学生的姓名和性别都会发生改变。因此,学号对姓名和性别的依赖是完全函数依赖。

例如,在一个学生信息表中,如果学生的学号(StudentID)唯一地决定了他的姓名(Name)和年龄(Age),则可以表示为:StudentID → Name, Age。这里的完全函数依赖指学号对姓名和年龄的决定是最小的,即没有其他属性或属性组对姓名和年龄的取值有影响。

部分函数依赖(Partial Functional Dependency)

部分函数依赖是指在一个关系中,X对Y的决定不是最小的,也就是说,Y可以由X中的某个真子集决定。例如,学生的姓名和性别的值可能由学号和出生日期的组合决定,但是学号或者出生日期单独来看都不能确定姓名和性别的值。因此,学号和出生日期对姓名和性别的依赖是部分函数依赖。

例如,在一个订单表中,如果订单号(OrderID)和订单日期(OrderDate)组合决定了客户姓名(CustomerName),但是订单号或订单日期单独来看都不能确定客户姓名,则可以表示为:{OrderID, OrderDate} → CustomerName。这里的部分函数依赖指客户姓名可以由订单号和订单日期的组合决定,但是其中任意一个属性都不能单独决定客户姓名。

传递函数依赖(Transitive Functional Dependency)

传递函数依赖是指在一个关系中,X对Y的决定不是直接的,而是通过另一个属性集合Z来传递的。例如,学生的班级决定了他所在的学院和专业,班级和学院的关系是一对多的,学院和专业的关系也是一对多的,因此班级对专业的依赖就是通过学院这个中介属性集合传递的。

例如,在一个学生信息表中,如果学生的班级(Class)决定了他所在的学院(College)和专业(Major),而学院又决定了专业,则可以表示为:Class → College, Major。这里的传递函数依赖指班级对专业的决定是通过学院这个中介属性集合传递的,而不是直接决定的。

异常

插入异常(Insertion Anomaly)

插入异常是指在向数据库表中插入新数据时,由于表的设计不合理,导致无法插入完整的数据行。例如,假设一个订单表中包含订单号、客户姓名和客户地址三个属性,如果有一些客户没有下订单,就无法将他们的姓名和地址插入订单表中,这就是插入异常。

更新异常(Update Anomaly)

更新异常是指在更新数据库表中的数据时,由于表的设计不合理,导致同一数据在不同地方重复出现,从而导致更新时需要修改多个副本,容易出现数据不一致的情况。例如,假设一个学生信息表中包含学生的学号、姓名和班级三个属性,如果一个学生转班了,就需要更新他的班级信息,但是如果该学生在多个地方都有记录,就需要同时更新多个副本,容易出现更新不一致的情况。

删除异常(Deletion Anomaly)

删除异常是指在从数据库表中删除数据时,由于表的设计不合理,导致无法删除部分数据行,或者删除一个数据行会同时删除其他数据行。例如,假设一个课程表中包含课程号、课程名称和授课教师三个属性,如果一个教师离职了,就需要将他所授课程从课程表中删除,但是如果该教师所授多门课程都在同一数据行中,就需要删除整个数据行,从而导致其他课程的信息也被删除了。

这些异常都是由于关系数据库表的设计不合理所导致的,而范式的设计原则就是为了解决这些异常。通过将数据规范化到符合特定范式的形式,可以避免或减少这些异常的出现,从而提高数据的一致性和完整性。

实例

以下的学生课程关系的函数依赖为 {Sno, Cname} -> {Sname, Sdept, Mname, Grade},键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。

SnoSnameSdeptMnameCnameGrade
1学生-1学院-1院长-1课程-190
2学生-2学院-2院长-2课程-280
2学生-2学院-2院长-2课程-1100
3学生-3学院-2院长-2课程-295

不符合范式的关系,会产生很多异常,主要有以下四种异常:

  • 冗余数据:例如 学生-2 出现了两次。
  • 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
  • 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 课程-1 需要删除第一行和第三行,那么 学生-1 的信息就会丢失。
  • 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。

范式

范式是一种关系数据库设计理论中的概念,它用于帮助设计者将数据存储在关系数据库中的最佳方式。范式的主要目的是减少数据冗余,提高数据的一致性和减少数据的更新异常。关系数据库设计理论中存在多种范式,例如第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。

第一范式要求每个属性都是原子性的、不可分割的,避免数据冗余和复杂性。第二范式要求一个关系中所有属性都应该依赖于该关系的候选键,避免了部分函数依赖关系。第三范式要求一个关系中不存在非主属性对主键的传递依赖,避免了传递依赖关系,使得数据的更新更加简单和高效。

范式理论是为了解决以上提到四种异常

高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。

第一范式(1NF)

第一范式要求每个属性都是原子的,即不可再分。例如,假设一个学生信息表中包含姓名和电话两个属性,如果将电话号码拆分成区号和号码两个属性,则违反了第一范式。

第二范式(2NF)

第二范式要求关系表中的每个非主属性都完全依赖于主键,即不存在部分函数依赖。例如,假设一个订单表中包含订单号、商品号、商品名称和价格四个属性,其中商品名称和价格都只与商品号有关系,而不与订单号有关系,就违反了第二范式。

分解前

SnoSnameSdeptMnameCnameGrade
1学生-1学院-1院长-1课程-190
2学生-2学院-2院长-2课程-280
2学生-2学院-2院长-2课程-1100
3学生-3学院-2院长-2课程-295

以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname
  • Sno, Cname-> Grade

Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。

Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。

分解后

关系-1

SnoSnameSdeptMname
1学生-1学院-1院长-1
2学生-2学院-2院长-2
3学生-3学院-2院长-2

有以下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname

关系-2

SnoCnameGrade
1课程-190
2课程-280
2课程-1100
3课程-295

有以下函数依赖:

  • Sno, Cname -> Grade

第三范式(3NF)

第三范式要求关系表中的每个非主属性都不传递依赖于主键,即不存在传递函数依赖。例如,假设一个学生信息表中包含学号、姓名、班级和学院四个属性,其中学院和专业只与班级有关系,而不与学号有关系,就违反了第三范式。

上面的 关系-1 中存在以下传递函数依赖:

  • Sno -> Sdept -> Mname

可以进行以下分解:

关系-11

SnoSnameSdept
1学生-1学院-1
2学生-2学院-2
3学生-3学院-2

关系-12

SdeptMname
学院-1院长-1
学院-2院长-2

第四范式(4NF)

第四范式要求关系表中不存在多值依赖。多值依赖是指一个或多个属性的值可以由一个或多个非主属性集合决定,而不是由主键决定。例如,假设一个订单表中包含订单号、商品号、商品名称和订单数量四个属性,其中订单数量可以由订单号和商品号的组合决定,而不是由订单号或商品号单独决定,就违反了第四范式。

实例

假设有一个学生信息表,包含以下属性:

  • 学号(StuID)
  • 姓名(Name)
  • 年龄(Age)
  • 班级(Class)
  • 学院(College)
  • 专业(Major)

如果班级决定了学院和专业,即同一班级的学生所属的学院和专业都相同,那么就存在传递函数依赖。例如,如果有以下数据行:

StuIDNameAgeClassCollegeMajor
001Tom181AMath
002Jack191AMath
003Lucy202BEnglish

在这个例子中,班级为1的学生都属于学院A的数学专业,因此可以通过班级确定学院和专业的取值,存在传递函数依赖。如果要符合第三范式,则需要将原始的学生信息表拆分成两个表,分别是学生基本信息表和班级信息表,具体如下:

学生基本信息表(Student):

StuIDNameAge
001Tom18
002Jack19
003Lucy20

班级信息表(Class):

ClassCollegeMajor
1AMath
2BEnglish

在拆分后的表中,学生的基本信息和班级的信息被分别存储在不同的表中,避免了班级信息对于学生信息的传递函数依赖关系。这样设计的好处是,可以避免数据冗余和数据不一致的问题,同时也方便了数据的维护和查询。

总结

关系数据库设计理论是数据库领域中的一个重要分支,它提供了一套规范化的设计原则,用于规范关系数据库表的结构,以提高数据的一致性、完整性和可维护性。范式设计、函数依赖和数据库设计过程是关系数据库设计理论的核心要点。在实践中,需要根据不同的业务需求和数据特征选择合适的设计原则和设计方法,以实现数据的高效管理和利用。

同时,需要注意的是,范式设计和函数依赖分析虽然可以提高数据的一致性和完整性,但也会对数据库的性能和存储效率产生一定的影响。因此,在实际应用中,需要进行权衡和优化,以满足业务需求和性能要求。

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

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

相关文章

Mit6.006-problemSession04

4-1 序列旋转 下面是一个序列AVL树T。执行操作T.delete_at(8),该操作期间,每次旋转操作执行完后,画出该树。 4-2 Fick Nury Fick Nury领导n名超级英雄组成了精英团队——复仇者联盟。他听说:超人Sanos正在一个遥远星球上制造麻烦…

【JVM】7. 方法区

文章目录 7. 方法区7.1. 栈、堆、方法区的交互关系7.2. 方法区的理解7.2.1. 方法区在哪里?7.2.2. 方法区的基本理解7.2.3. HotSpot中方法区的演进 7.3. 设置方法区大小与OOM7.3.1. 设置方法区内存的大小7.3.2. 如何解决这些OOM 7.4. 方法区的内部结构7.4.1. 方法区&…

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问)

《汇编语言》- 读书笔记 - 第3章-寄存器(内存访问) 3.1 内存中字的存储问题 3.1 3.2 DS 和 [address]问题 3.2 3.3 字的传送问题 3.3问题 3.4 3.4 mov、add、sub 指令3.5 数据段问题 3.53.1~3.5 小结检测点 3.1 3.6 栈3.7 CPU 提供的栈机制问题 3.6 3.8 …

【数据结构】顺序表---C语言版(数据结构开篇小菜,全网最详细!小白看一遍就学会!!!)

文章目录 🍔一、前言🍟1. 什么是数据结构 🍔二、顺序表的概念----线性表🍟1. 什么是线性表🍟2. 顺序表与数组的区别 🍔三、顺序表详解💧 静态顺序表💧 动态顺序表🍎创建动…

C语言_VS系列编译器写C语言或C++代码产生的一些错误与警告的解决方法(VS2010/VS2019)

本次来分享在用VS系列编译(VS2010/VS2019)写C语言或C代码时会遇到的一些警告和错误,提供博主的一些解决方法,若有更好的解决方法,大家也可以在评论区发表自己的意见噢,话不多说,开始上菜: 此博主在CSDN发布…

【面试题】Redis缓存设计

文章目录 Redis缓存出现的问题🙎‍♂️面试官:什么是缓存雪崩?🙎‍♂️面试官:怎样解决缓存雪崩?🙎‍♂️面试官:什么是缓存击穿?🙎‍♂️面试官:…

Nacos集群和持久化配置

1.Nacos集群 1.1.架构说明 官方文档 集群部署架构图 因此开源的时候推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面 http://ip1:port/openAPI直连ip模式,机器挂则需要修改ip才可以使用 http://VIP:port/openAPI挂载VIP模式,直…

【TOOLS: Linux与windows及linux与linux之间文件传输常用方法及命令】

文章目录 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法1.1.2 SCP 文件传输方法1.1.3 FTP 文件传输方法 1.1.1 Windows和VirtualBox(Ubuntu)之间文件穿传输方法 1)设置 virtualbox 中的共享文件夹,用户可以在windows某个盘下创建自己的共享文件…

chatgpt赋能Python-python_6_66_666

Python 666666:学习Python的不同层次 Python是一种高级编程语言,被广泛用于机器学习、人工智能、web开发等领域。它简单易学,具有良好的可读性和可扩展性,因此受到众多程序员的喜爱。 在学习Python的过程中,我们可以…

python面向对象知识点

因为我之前学过Java,所以下文中的python面向对象知识点会和Java面向对象知识点比较记忆; python类的定义 python类的定义个其函数的定义格式相同,为此先复习函数定义格式: def add(num1, num2){return num1 num2 } 类定义格式…

自动构建之Makefile

链接: 自动构建之CMake Makefile Makefile是用于自动化构建软件项目的工具,Makefile的优点是简单、直接,可以直接使用make工具进行构建。但是,Makefile通常需要手动编写和维护,可能会导致跨平台和跨编译器的兼容性问题。 Makef…

【SVN内网穿透】远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

.Net Core 数据校验框架使用

为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求&…

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线(不想显示也可以不画)4. 报警模块5. 代码修改5.1 主代码5.2 细节修改(可忽略) 6. 实验效果 本篇博文工程源码下载 链接1:https://github.com/up-up-…

图片模块封装

图片模块封装 一.如何更换图片框架二.Glide配置1.依赖: 三.策略模式构建者模式图片框架搭建1.ImageOptions图片参数设置2.IImageLoader接口以及实现子类3.图片加载策略4.ImageLoader5.ImageLoaderManager6.使用:四.Bitmap三级缓存二次采样五.长图大图处理 一.如何更…

华为OD机试真题 Java 实现【任务混部】【2023Q1 200分】

一、题目描述 公司创新实验室正在研究如何最小化资源成本,最大化资源利用率,请你帮他们解决一个任务混部问题: 有taskNum项任务,每个任务有开始时间(startTime ),结束时间(endTime…

Linux系统之cut命令的基本使用

Linux系统之cut命令的基本使用 一、cut命令介绍1. cut命令简介2.cut命令的由来 二、在Linux中命令帮助1. cut的help帮助信息2. cut的选项 三、cut的基本使用1. 指定字段的内容2. 使用分隔符打印文本内容3. 显示行中指定范围的字符 四、cut命令的日常使用1. 提取IP地址2. 提取本…

position:sticky-粘性吸附布局

一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致,当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动(overflow:auto&…

快速入门Springboot整合Datagpa操作数据库

简介SpringDatagpa Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 . JPA是ORM规范,Hibernate是JPA规范的具体实现,这样的好处是开发者可以面向JPA规范进行持久层的开发,而底层的实现则是可以切换的。S…