【数据库系统原理】函数依赖与范式

在数据库设计中,范式(Normal Forms, NF)是用来规范化数据库表结构,以减少冗余数据和提高数据一致性与完整性的重要工具。

函数依赖

完全函数依赖与部分函数依赖

完全函数依赖

定义
完全函数依赖表示的是在一个关系中,若某个非主属性数据项依赖于全部关键字,则称这种依赖为完全函数依赖。换句话说,如果非主属性B函数依赖于构成某个候选关键字的一组主属性A,而且A的任何一个真子集不能被B函数依赖,则称B完全函数依赖于A。

举例
以成绩表为例,该表包含 (学号,课程号,成绩) (学号,课程号,成绩) (学号,课程号,成绩)三个属性。其中, (学号,课程号) (学号,课程号) (学号,课程号)是一个候选键,因为它们共同确定了一个唯一的成绩。

  • 完全函数依赖:在这个例子中, (学号,课程号) → 成绩 (学号,课程号)→ 成绩 (学号,课程号)成绩是一个完全函数依赖。因为成绩完全依赖于学号和课程号的组合,单独的学号或课程号都不能确定成绩。

部分函数依赖

定义
部分函数依赖是指在一个关系中,如果 X → Y X→Y XY,并且存在 X X X的一个真子集 X 0 X₀ X0,使得 X 0 → Y X₀→Y X0Y,则称 Y Y Y X X X部分函数依赖。这意味着 Y Y Y不仅依赖于 X X X的全部,还依赖于 X X X的某个真子集。

举例
以成绩表为例,假设该模式包含 (学号,课程号,成绩,年龄) (学号,课程号,成绩,年龄) (学号,课程号,成绩,年龄)四个属性。

  • 部分函数依赖:在这个例子中,如果 学号 学号 学号能单独确定 年龄 年龄 年龄,而 (学号,课程号) (学号,课程号) (学号,课程号)共同确定 成绩 成绩 成绩。那么, (学号,课程号) → 年龄 (学号,课程号)→ 年龄 (学号,课程号)年龄就是一个部分函数依赖,因为 年龄 年龄 年龄不仅依赖于 (学号,课程号) (学号,课程号) (学号,课程号)的组合,还依赖于 学号 学号 学号这个真子集。

归纳

  • 完全函数依赖强调的是非主属性对全部关键字的依赖,即不存在关键字的真子集能够确定非主属性。
  • 部分函数依赖则允许非主属性对关键字的某个真子集也存在依赖关系。

范式

第一范式(1NF - First Normal Form)

定义
1NF要求数据库表中的每个列(或称为属性、字段)都包含不可再分的原子数据,也就是说每个单元格中只包含一个值。不应该有多值属性或重复组。

要点

  1. 每个表中的每一列都必须包含不可再分的原子数据。
  2. 表中的每一行必须具有唯一的标识符,通常是主键。

举例

假设我们有一个表示图书信息的表,初始设计如下:

图书信息图书号书名作者出版社
示例123《编程基础》;《数据库原理》李四,王五清华大学出版社;机械工业出版社

这个表不满足1NF,因为“书名”和“作者”列包含了多个值(由分号分隔),它们是可以再分的。为了满足1NF,我们需要将这些列拆分为多个列,如下:

图书号书名1作者1出版社1书名2作者2出版社2
123《编程基础》李四清华大学出版社《数据库原理》王五机械工业出版社

但上述设计仍然不是最佳实践,因为它引入了不必要的冗余。更常见的方法是将每本书的信息分别存储在不同的行中,如下所示:

图书号书名作者出版社
123《编程基础》李四清华大学出版社
456《数据库原理》王五机械工业出版社

第二范式(2NF - Second Normal Form)

定义
2NF建立在1NF的基础上,要求关系模式中的所有非主属性都完全依赖于候选键(或称为主键),而不是仅依赖于候选键的一部分

要点

  1. 满足1NF。
  2. 非主属性必须完全依赖于候选键

举例

假设我们有一个表示学生选课信息的表,初始设计如下:

学号课程号成绩课程学分
N01C01903
N01C02854
N02C01883

在这个例子中,学号(SNO)和课程号(CNO)的组合是主键(候选键)。然而,“课程学分”这一非主属性仅依赖于课程号(CNO),而不是完全依赖于主键(SNO, CNO)。这违反了2NF。

为了满足2NF,我们需要将“课程学分”这一属性移到一个新的表中,该表以课程号(CNO)为主键,如下所示:

表1:选课信息

学号课程号成绩
N01C0190
N01C0285
N02C0188

表2:课程信息

课程号课程学分
C013
C024

这样,我们就通过分解原始表来满足了2NF,减少了数据冗余并提高了数据一致性

第三范式(3NF - Third Normal Form)

定义
3NF建立在2NF的基础上,要求关系模式中的所有非主属性都不传递依赖于候选键

换句话说,如果非主属性A依赖于另一个非主属性B,而B又依赖于候选键C,那么A不能直接依赖于B,而必须直接依赖于C。

要点

  1. 满足2NF。
  2. 消除传递依赖。

举例

考虑一个表示学生信息的表,其中包含了学生、课程、成绩以及课程对应的教师信息。

原始设计可能如下:

学生ID学生姓名课程号课程名成绩教师ID教师姓名

在这个例子中,学生ID和课程号的组合是主键(候选键)。

然而,“教师姓名”这一非主属性仅依赖于“教师ID”,而“教师ID”又依赖于“课程号”

这构成了一个传递依赖,因为“教师姓名”间接地依赖于主键的一部分(即“课程号”),而不是直接依赖于整个主键(学生ID和课程号)。

为了满足3NF,我们需要将“教师”相关的信息移到一个新的表中,如下所示:

表1:学生选课信息

学生ID学生姓名课程号成绩

表2:课程信息

课程号课程名教师ID

表3:教师信息

教师ID教师姓名

Boyce-Codd范式(BCNF - Boyce-Codd Normal Form)

定义
BCNF是由Boyce和Codd提出的,它比3NF更为严格。BCNF要求关系模式中的所有属性(包括主属性)都不传递依赖于候选键

要点

  1. 所有非主属性对每一个候选键都是完全函数依赖
  2. 所有的主属性对每一个不包含它的候选键,也是完全函数依赖
  3. 没有任何属性完全函数依赖于非候选键的任何一组属性

解释
BCNF不仅要求非主属性不传递依赖于候选键,还要求主属性也不传递依赖于候选键。这意味着在BCNF中,任何属性都不能间接地依赖于候选键的任何一部分。这进一步减少了数据冗余和更新异常的可能性。

由于BCNF的定义较为复杂,通常在实际应用中,数据库设计者会首先尝试满足1NF、2NF和3NF,然后在必要时才考虑BCNF。这是因为满足BCNF的数据库模式可能更加复杂,不易于理解和维护。然而,在某些情况下,特别是在需要高度数据一致性和完整性的应用中,BCNF可能是一个有用的工具。

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

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

相关文章

Java排序算法汇总篇,八种排序算法

排序算法汇总: Java排序算法(一):冒泡排序 Java排序算法(二):选择排序 Java排序算法(三):插入排序 Java排序算法(四):快速排序 Java排序算法(五):归并排序 Java排序算法(六):希尔排序 Java排序算法(…

18.Redis之哨兵

1.哨兵机制的介绍 通过自动化的手段,来解决主节点挂了的问题~~ 哨兵机制, 是通过独立的 进程 来体现的.和之前 redis-server 是不同的进程!! redis-sentine| 不负责存储数据,只是对其他的 redis-server 进程起到监控的效果~~ 通常哨兵节点,也会搞一个集合~~(多个哨兵节点构成的…

【Pr学习】01新建项目起步

【Pr学习】01新建项目起步 1、新建项目2.序列设置2.1新建序列2.2序列参数讲解2.3自定义设置 3.PR窗口认识3.1 项目窗口3.2 源窗口2.4 保存面板 4.剪辑导入4.1 素材导入4.2 视图切换4.3 时间轴4.4轨道工具4.5 节目窗口素材导入 5.基础操作5.1 取消视频音频链接5.2 单独渲染&…

Qos令牌桶算法:笔记0601

令牌桶 令牌:目前看到2种表述,csdn表示一个令牌代表一个字节,51cto是一个令牌代表一个bit。51cto上关于cisco qos算法描述多表达为一个令牌一个bit (不知道rfc上咋表达的懒得去查了,主打一个好读书不求甚解,感觉应该是…

[无监督学习] 11.详细图解LSA

LSA LSA(Latent Semantic Analysis,潜在语义分析)是一种自然语言处理技术。作为一种降维算法,它常被用于信息搜索领域。使用 LSA 能够从大量的文本数据中找出单词之间的潜在关联性。 概述 LSA 是在 1988 年被提出的算法&#xff…

Sqoop与Shell脚本数据迁移实战

文章目录 前言一、sqoop实战示例1. 获取所有数据库2. 获取指定数据库的所有表3. 查询数据4. 把指定数据库的所有表导入指定hive数据库5. 把指定表导入hive数据库的指定表6. 查询数据导入到指定表 二、shell脚本实战示例1. shell脚本2. 解释 总结 前言 在数据驱动的时代&#x…

AI产品导航站

1、AI产品导航站 (chat2ai.cn)

更新mirh connect 内置derby数据库密码

更新mirh connect 内置derby数据库密码 1、下载derby连接客户端 https://archive.apache.org/dist/db/derby/ 选择任意版本即可,比如 https://archive.apache.org/dist/db/derby/db-derby-10.14.2.0/db-derby-10.14.2.0-bin.zip 2、连接mirh文件数据库 1、把mi…

UnityAPI学习之游戏物体的方法使用

目录 游戏物体 创建游戏物体的三种方式 组建的获取和查找 游戏物体的方法与其他成员变量 游戏物体的生成 游戏物体的激活状态/标签(tag)/层级(layer) 游戏物体的激活与失活 游戏物体的查找 1. 名称查找(Find) 2. 通过标签查找游戏物体(FindGameObjectWithT…

关于linux程序的查看、前台运行、后台运行、杀死的管理操作。

前言 在Linux中, 程序(program)是放在磁盘上的程序,是不会执行的。 进程(process)是程序被触发,从而加载到内存中的,会被CPU随机执行。 Linux中,有非常多的进程在实时运…

【Python】临时禁用系统代理设置

在Python中,如果你想要临时禁用系统代理设置,可以使用以下方法: python import os import requests# 获取当前的环境变量 proxy_env_vars {HTTP_PROXY, HTTPS_PROXY, http_proxy, https_proxy} current_proxies {k: v for k, v in os.envi…

Vue:现代前端开发的首选框架-【声明周期钩子详解】

引言 Vue.js 是一个流行的前端框架,它通过组件化的开发方式,让开发者能够构建出高效且可维护的应用程序。在Vue中,生命周期钩子(Lifecycle Hooks)是理解组件行为的关键概念。本文将深入探讨Vue生命周期钩子&#xff0…

网络故障与排除(四)

一、WLAN网络优化分为几个部分 WLAN网络进行优化时,可以从下面几个方面开展优化: 1.AP功率调整; 2.天馈系统调整; 3.AP信道调整; 4.干扰调整; 5.网络侧组网和带宽调整。 二、Portal重定向原理 1、P…

如何让Google收录网页?

确保网页被Google快速且持续地收录,页面的质量起着至关重要的作用。高质量的网页不仅更容易被搜索引擎收录,而且能够提高网页在搜索结果中的排名,想确保页面的质量,要保持原创,确保你的内容是独一无二的,别…

Python基础教程——数据类型和变量

数据类型和变量 Python使用缩进来组织代码块,一般使用4个空格的缩进.使用#来注释一行,其他每一行都是一个语句,当语句以冒号:结尾时,缩进的语句视为代码块.Python对大小写敏感. 1.1 整数 Python可以处理任意大小的整数,包括负整数,写法与数学上写法一致,例如:-10…

使用OpenCV进行简单图像分割的3个步骤

想象一下,用几行Python代码就能让你的照片中的人物“跳”出来,或者精准地把蓝天从背景中分离。今天,我们就用OpenCV这个强大的图像处理库来实现这一魔法,而且只需要三个简单的步骤!让我们一起,把复杂的技术…

Qt Creator中, ui设计中设置属性无效, 会自动变回去问题

最近学qt遇到个问题, 很奇怪, 具体表现为: 我想修改这个字体大小为12, 但是修改后会自动变回9, 我读取qss方式设置样式, 依然无效!找了很久,最终发现是我在最上层设置了字体大小, 导致下面的所有控件, 全部设置字体无效&#xff…

不常用但特别好用的字符串方法—.partitioin()和.translate()

不常用但特别好用的字符串方法—.partitioin()和.translate() 在 Python 中, str.partition() 和 str.translate() 是两种有用的字符串方法,可以帮助您以不同的方式操作字符串。 1. str.partition(sep) 该 partition() 方法使用指定的分隔符 ( sep ) 将字符串拆分为三个部…

文档分词与词汇权重(TF-IDF)

文档分词与词汇权重 1、文档分词2、词汇权重(TF-IDF) 1、文档分词 文本分类主要做的是如何提取文本中的主要信息。那么,如何衡量哪些信息是主要信息呢? 我们知道,一篇文档是由若干词汇组成的,也就是文档的…

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

Flutter 中的 SliverCrossAxisGroup 小部件:全面指南 Flutter 是一个功能丰富的 UI 开发框架,它允许开发者使用 Dart 语言来构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中,SliverCrossAxisGroup 是一个较少被使用的组…