【数据库系统概论】函数依赖与范式

概述

在数据库设计中,范式(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

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

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

表1:选课信息

学号课程号成绩
N01C0190
N01C0285
N02C0188

表2:课程信息

课程号课程学分
C013
C024

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

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

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

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

B → A , C → B (非3NF) B → A , C → B \tag{非3NF} BA,CB(3NF)

C → A , C → B (3NF) C → A , C → B \tag{3NF} CA,CB(3NF)

要点

  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/web/21411.shtml

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

相关文章

开源项目介绍:Vision Pro上的棋盘游戏复刻——融合现实与虚拟的娱乐新体验

在探索Apple Vision Pro潜力的旅途中,一款精心打造的开源棋盘游戏复刻项目正吸引着众多开发者和游戏爱好者的目光。该项目不仅展示了混合现实技术的无限魅力,还为AVP(Apple Vision Pro)游戏领域的小白开发者们提供了一个理想的实践起点。让我们一起深入了解这个集创意与实用…

解决odbc 数据源创建之后删除失败问题

问题描述 该问题一般存在于用32位odbc管理程序删除了64位管理程序创建的数据源,被提示失败,然后再用64位odbc管理程序删除时发现删除不掉。怎么都删除不掉,不会影响体验,但是很膈应 问题解决 将该路径下的对应的ODBC数据源&…

低空经济面临的挑战

安全监管挑战。低空领域的安全问题是一个重要的挑战。低空飞行的航空器数量不断增加,这对空中交通管理和安全监管提出了更高的要求,如何确保低空飞行的安全,防范事故的发生,是亟待解决的问题。应加大对低空安全发展体系的构建研究…

使用Minikube+docker+harbor+k8s自动化部署 @by_TWJ

目录 1. 开始1.1. 环境1.2. 测试的git仓库1.3. 离线文件1.4. 安装docker1.5. 安装docker-compose(非必要)1.6. 安装Jenkins1.7. 安装harbor1.8. 允许docker通过http访问私有仓库1.9. 修改/etc/hosts,追加自定义域名1.10. 安装Minikube 2. min…

【Javascript系列】Terser通过调用API来实现代码的压缩和优化功能

Terser通过调用API来实现代码的压缩和优化功能 起源通过API来调用API调用过程中的一个隐含的技术点 - 异步调用和Promise对象官方文档中的一个有点容易忽略和混淆的地方关于Promise 起源 书接 上回,对Terser的功能做了一个初步的探索。在官方的主页上,有…

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT,并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…

SRE养成计划之03-用户与组权限(持续更新)

用户与组 概念 用户作用: 登陆操作系统方便做权限的不同设置用户的唯一标识:UIDLinux系统默认管理员root,管理员root的UID为0 组的作用 方便管理众多的用户,方便对用户进行分类 组的唯一标识:GID 组的分类&#xf…

22、matlab锯齿波、三角波、方波:rectpuls()函数/sawtooth()函数/square()函数

1、采样的非周期性矩形 语法 语法1:y rectpuls(t) 返回一个以数组 t 中指示的采样时间采样的连续非周期性单位高度矩形脉冲,该矩形脉冲以 t 0 为中心。 语法2:y rectpuls(t,w) 生成一个宽度为 w 的矩形 参数 t:采样时间 w:矩形宽度…

两步教你学会内网穿透

文章目录 1.下载安装ngrok安装包2.生成固定的域名3.访问 1.下载安装ngrok安装包 1.注册登录ngrok网站ngrok官网 页面下滑点击下载下载: 2.解压(双击ngrok.exe进入终端) 3.终端绑定账户信息(复制如下图信息到终端) …

力扣2379.得到k个黑块的最少涂色次数

力扣2379.得到k个黑块的最少涂色次数 i为右端点 class Solution {public:int minimumRecolors(string blocks, int k) {int w0;for(int i0;i<k;i){if(blocks[i] W) w;}int res w;for(int ik;i<blocks.size();i){w (blocks[i] W) - (blocks[i-k] W);res min(res,…

Win11下只支持IE浏览器的老网站顺畅运行的方法

在Windows 11操作系统中&#xff0c;由于Internet Explorer&#xff08;IE&#xff09;浏览器的逐步淘汰&#xff0c;微软官方已不再直接支持IE浏览器。然而&#xff0c;当您遇到必须访问仅支持IE的老旧网站时&#xff0c;Windows 11仍然提供了一些实用的替代方案来应对这一挑战…

前端加载,渲染十万条数据(性能优化)

1.场景 项目中某个弹窗展示设备信息卡片,返回的设备信息很多,页面样式有很花哨,导致渲染极其缓慢 f12,查看性能,这里可以看到页面加载在哪一步分耗时最长,针对性进行优化(图为举例) 2.解决思路 采用虚拟列表的方式,滚动时,dom元素数量不变,只改变展示的数据 结构描述: 父盒…

快速入门文件操作+5种例子演示

文件操作 基本操作注意事项例子1&#xff1a;读取文件内容例子2&#xff1a;写入文件内容例子3&#xff1a;追加文件内容例子4&#xff1a;读取并写入文件内容&#xff08;复制文件&#xff09;例子5&#xff1a;使用二进制模式读写文件 基本操作 在C语言中&#xff0c;使用文…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中&#xff0c;还需要提示给用户&#xff0c;前端和后端需要作一些约定&#xff1a; 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错&#xff0c;非200为操作异常。…

在国内PMP含金量并不高?

PMP已经在全球194个国家和地区得到广泛认可&#xff0c;自1999年开始在国内实施。PMP被认为是项目管理专业身份的象征&#xff0c;是项目经理最重要的资质。获得PMP证书意味着个人的项目操作水平已经得到了PMI的认可&#xff0c;具备国际专业项目操作者水平&#xff0c;有资格专…

就凭这张图,下订华为享界S9

文 | Auto芯球 作者 | 雷慢 冲啦&#xff01;就在刚刚&#xff0c; 我们团队下订了一辆享界S9&#xff0c; 还琢磨买奔驰S级&#xff0c;宝马7系和奥迪A8的老板们&#xff0c; 是应该试试享界S9了&#xff0c; 至少先占个坑&#xff0c;8月底S9上市当天&#xff0c; 可以…

Linux 系统中的用户与用户组管理

Linux 系统中的用户与用户组管理 Linux系统是一个多用户多任务的分时操作系统&#xff0c;任何一个要使用系统资源的用户&#xff0c;都必须首先向系统管理员申请一个账号&#xff0c;然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行…

【vscode免密连接云服务器】

目录&#xff1a; 前言1.1 生成 SSH 密钥对1.2 将公钥复制到远程服务器1.3配置remote ssh 插件信息 总结 前言 剑指offer&#xff1a;一年又120天 1.1 生成 SSH 密钥对 在本地cmd命令窗口执行: ssh-keygen -t rsa会提示你设置生成密钥的文件、密码等等&#xff0c;可以一路回…

Flask启动重复注册schedule问题

最近flask里面新加个schedule任务&#xff0c;但是启动的时候看log&#xff0c;schedule被注册了两次。导致每次任务都会被执行两次&#xff0c;查了下解决方案&#xff0c;记录 加一个标志位就行了 import osfrom flask import Flask from apscheduler.schedulers.backgroun…

【Makefile笔记】小白入门篇

【Makefile笔记】小白入门篇 文章目录 【Makefile笔记】小白入门篇所需组件一、简单了解Makefile1.Makefile简介2.Makefile 原理 二、为什么要使用Makefile1.解决编译时链库的不便2.提高编译效率&#xff0c;缩短编译时间&#xff08;尤其是大工程&#xff09; 三、Makefile语法…