当前位置: 首页 > news >正文

8.5.数据库基础技术-规范化

函数依赖

  • 函数依赖:给定一个X,能唯一确定一个Y,就称X决定(确定)Y,或者说Y依赖于X。
    例如:Y=X*X函数,此时X能确定Y的值,但是Y无法确定X的值,比如x=2,y=4,但是y=4无法确定x=2。
  • 函数依赖又可扩展以下两种规则:
    • 部分函数依赖:A可决定C,(A,B)也可决定C,既然A都可以决定C了,那么要不要B其实都无所谓了,所有这种就称之为部分函数依赖。
    • 传递函数依赖:当A和B不相同时,A可决定B,B可决定C,则A可决定C,是传递函数依赖;若A和B相同,则不存在传递了,A就可以直接就可决定C。
      在这里插入图片描述

函数依赖的公理系统

函数依赖的公理系统(Armstrong:阿姆斯特朗公理)是指一组用于推导和证明函数依赖的规侧和公理集合。设关系模式R(U,F),其中U为属性集,F是U上的一组函数依赖,那么有以下推理规则。

  • 自反律:对于任意属性集合X和Y,有Y⊆X⊆U,则X→Y被F逻辑蕴含。
    • 也就是说如果属性集Y属于X,则X可以决定Y,又可以说属性集X可以决定他的属性子集。
  • 增广律:对于任意属性集合X、Y和Z,如果X→Y,那么XZ→YZ。
    • 如果X→Y在F这个函数依赖集合中,另一属性(组)Z是属性集U中的元素,那么从F中可以推导出XZ函数决定YZ。
  • 传递律:对于任意属性集合X、Y和Z,如果X→Y且Y→Z,那么X→Z。

根据上述3条推理规则又可推出下述3条推理规则:

  • 合并律:对于任意属性集合X、Y和Z,如果X→Y和X→Z,那么X→YZ。
  • 分解律:对于任意属性集合X、Y和Z,如果X→YZ,则X→Y和X→Z。
  • 合成律:对于任意属性集合X、Y和Z,如果X→Y且Y→Z,那么XZ→YZ。

键与约束

  • 超键(码):能够唯一标识一条记录的属性或属性集。换句话说,超键中的属性组合可以保证每个元组在关系中都是唯一的。
    举例:假设我们有一个学生表,包含以下属性:学号、姓名、性别、出生日期,那么,以下属性集合都是超键:{学号}、{学号,出生日期}、{姓名,性别,出生日期,因为这些属性组合都可以唯一标识每个学生。
  • 候选键:超键中不包含任何冗余属性的超键。换句话说,候选键中的每个属性都是必需的,用于唯一标识元组。
    举例:在上面的例子中,{学号}是候选键,因为它是唯一标识学生的最小属性集合。如果我们设置姓名不能重复的话,那姓名也是一个候选键,但是{姓名,性别,出生日期这个组合就不是了,因为性别和出生日期冗余了,可以由姓名得到
  • 主属性:包含在任一候选码中的属性称主属性。换句话说,主属性是候选码所有属性的并集
    举例:在上面的例子中,如果姓名不能重复,那么主属性就是学号和姓名
  • 主键:从候选键中选取的一个属性或属性集合,作为表中元组的唯一标识符。
    举例:在上面的例子中,我们可以选择{学号}作为主键。
学号姓名性别年龄系别专业
20020612李辉20计算机软件开发
20060613张明18计算机软件开发
20060614王小玉19物理力学
20060615幸汉华17生物动物学
20060616赵静21化学食品化学

超键:能够唯一标识一条记录的属性或属性集。{学号}、{姓名}、{学号,姓名}、{学号,姓名,性别}…
候选键:能够唯一标识一条记录的最小属性集。{学号}、{姓名}
主属性:候选码所有属性的并集。{学号、姓名}

外键:是指一个表中的属性,它引用另一个表中的主键。外键用于建立表之间的关系。
实体完整性约束:即主键约束,主键值不能为空,也不能重复
参照完整性约束:即外键约束,外键必须是其他表中已经存在的主键的值,或者为空
用户自定义完整性约束:自定义表达式约束,如设定年龄属性的值必须在0到180之间。

案例

在这里插入图片描述
超键:包含雇员编号在内的任意组合,如果名字不允许重复,也可以是包含名字在内的任意组合
候选键:雇员编号,如果名字不允许重复,还有名字
主键:雇员编号从候选键中选择的最简单属性用于唯一标识一行记录)
外键:部门编号(在雇员表中指向部门表的主键用于两张表之间的联系)
主属性:雇员编号,姓名

范式

第一范式1NF

第一范式1NF:要求数据库表中的所有字段都是不可分割的原子值。通俗地说,第一范式就是表中不允许有小表的存在。比如,对于如下的员工表,就不属于第一范式:薪资被拆成了基本工资和补贴
在这里插入图片描述
例:用一个单一的关系模式学生来描述学校的教务系统:学生(学号,学生姓名,系号,系主任姓名,课程号,成绩)
依赖关系(学号->学生姓名,学号->所在系,所在系>系主任姓名,(学号,课程号)->成绩)
在这里插入图片描述

第二范式2NF

第二范式:在1NF的基础上,要求数据库表中的每个非主属性完全依赖于某一个候选键
通俗地说,就是表中不能存在联合主键,按照定义,上面的学生表就不满足2NF,因为学号不能完全确定成绩(每个学生可以选多门课)。

解决方案:将学生表分解为:

  • 学生(学号,学生姓名,系编号,系名,系主任)
  • 选课(选课d,学号,课程号,成绩)。
    每张表均属于2NF。

第三范式3NF

第三范式:在2NF的基础上,要求数据库表中的每个非主属性不依赖于其它非主属性。也就是说,数据表中的每一列都和主键直接相关,而不依赖于其它列,即不能行在传递依赖

继续上面的实例,学生关系模式就不属于3NF,因为学生无法直接决定系主任和系名,是由学号->系编号,再由系编号->系主任,系编号->系名,因此存在非主属性对主属性的传递依赖,
解决方案:将学生表进一步分解为:

  • 学生(学号,学生姓名,系编号)
  • 系(系编号,系名,系主任)
  • 选课(选课id,学号,课程号,成绩)
    每张表都属于3NF。

BC范式BCNF

BC范式(BCNF):规范化数据库设计的一种方法,它对关系型数据库中的表进行分解,其符合第三范式(3NF),同时尽量避免数据冗余和不一致性,提高数据的可靠性和完整性。

假设仓库管理关系表(仓库ID,存储物品ID,管理员ID,数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。此关系模式已经属于了3F,那么这个关系模式是否存在问题呢?我们来看以下几种操作:

  • 删除异常:当仓库被清空后,所有”存储物品D”和”数量”信息被删除的同时,”仓库ID”和”管理员D”信息也被删除了。
  • 插入异常:当仓库没有存储任何物品时,无法给仓库分配管理员。
  • 更新异常:如果仓库换了管理员,则表中所有行的管理员D都要修改。

解决方案:把仓库管理关系表分解为二个关系表;

  • 仓库管理:(仓库ID,管理员ID);
  • 仓库:(仓库ID,存储物品ID,数量)。
    这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。

练习题

给定关系模式R(U,F),U={A,B,C,D,F={AB→C,CD一B。关系R(),且分
别有()。
A.只有1个候选关键字ACB
B.只有1个候选关键字BCD
C.有2个候选关键字ACD和ABD
D.有2个候选关键字ACB和BCD

A.0个非主属性和4个主属性
B.1个非主属性和3个主属性
C.2个非主属性和2个主属性
D.3个非主属性和1个主属性

答案C A
候选关键字的求法:根据依赖集,找出从未在右边出现过的属性(有出度没有入度),必然是候选键之一,以该属性为基础,根据依赖集依次扩展,看能香遍历所有属性,将无法遍历的加入候选键中。
在这里插入图片描述

设有关系模式R(E,N,M,L,Q),其函数依赖集为F={E一→N,EM一→Q,M一L)。则
关系模式R达到了(),该关系模式()
A.1NF
B.2NF
C.3NF
D.BCNF

A.无需进行分解,因为已经达到了3NF
B.无需进行分解,因为已经达到了BCNF
C尽管不存在部分函数依赖,但还存在传递依赖,所以需要进行分解
D.需要进行分解,因为存在冗余、修改操作的不一致性、插入和删除异常

答案A D
有联合主键EM,不满足2NF
在这里插入图片描述

相关文章:

8.5.数据库基础技术-规范化

函数依赖 函数依赖:给定一个X,能唯一确定一个Y,就称X决定(确定)Y,或者说Y依赖于X。 例如:YX*X函数,此时X能确定Y的值,但是Y无法确定X的值,比如x2,y4,但是y4无法确定x2。函数依赖又可扩展以下两…...

于博士Cadence视频教程学习笔记备忘

标签:PCB教程 PCB设计步骤 cadence教程 Allegro教程 以下是我学习该视频教程的笔记,记录下备忘,欢迎大家在此基础上完善,能回传我一份是最好了,先谢过。 备注: 1、未掌握即未进行操作 2、操作软件是15.…...

8.3.数据库基础技术-关系代数

并:结果是两张表中所有记录数合并,相同记录只显示一次。交:结果是两张表中相同的记录。差:S1-S2,结果是S1表中有而S2表中没有的那些记录。 笛卡尔积:S1XS2,产生的结果包括S1和S2的所有属性列,并且S1中每条记…...

【Vue3】vue模板中如何使用enum枚举类型

简言 有的时候,我们想在vue模板中直接使用枚举类型的值,来做一些判断。 ts枚举 枚举允许开发人员定义一组命名常量。使用枚举可以更容易地记录意图,或创建一组不同的情况。TypeScript 提供了基于数字和字符串的枚举。 枚举的定义这里不说了…...

组合求和2

题目描述: Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sum to target. Each number in candidates may only be used once in the combinati…...

Apple Maps现在可在Firefox和Mac版Edge浏览器中使用

Apple Maps最初只能在 Windows 版 Safari、Chrome 浏览器和 Edge 浏览器上运行,现在已在其他浏览器上运行,包括 Mac 版 Firefox 和 Edge。经过十多年的等待,Apple Maps于今年 7 月推出了新版地图应用的测试版,但只能在有限的浏览器…...

基于嵌入式Linux的数据库

数据库 数据库是在数据库管理系统和控制之下,存放在存储 介质上的数据集合。 基于嵌入式的数据库 基于嵌入式linux的数据库主要有SQlite, Firebird,Berkeley DB,eXtremeDB Firebird是关系型数据库,功能强大,支持存储过 程&…...

C# 使用LINQ找出一个子字符串在另一个字符串中出现的所有位置

一、实现步骤 遍历主字符串,使用IndexOf方法查找子字符串的位置。如果找到了子字符串,记录其位置,并且从该位置的后面继续查找。重复上述步骤直到遍历完整个字符串。 二、简单代码示例 using System; using System.Collections.Generic; usi…...

YOLOv8添加MobileViTv3模块(代码+free)

目录 一、理由 二、方法 (1)导入MobileViTv3模块 (2)在ultralytics/nn/tasks.py的函数parse_model中修改 (3)在yaml配置文件中写入 (4)开始训练,先把其他梯度关闭&…...

从概念到落地:全面解析DApp项目开发的核心要素与未来趋势

随着区块链技术的迅猛发展,去中心化应用程序(DApp)逐渐成为Web3时代的重要组成部分。DApp通过智能合约和分布式账本技术,提供了无需信任中介的解决方案,这种去中心化的特性使其在金融、游戏、社交等多个领域得到了广泛…...

仓颉编程入门 -- 泛型概述 , 如何定义泛型函数

泛型概述 , 如何定义泛型函数 1 . 泛型的定义 在仓颉编程语言中,泛型机制允许我们定义参数化类型,这些类型在声明时不具体指定其操作的数据类型,而是作为类型形参保留,待使用时通过类型实参来明确。这种灵活性在函数和类型声明中…...

SOC估算方法之(OCV-SOC+安时积分法)

一、引言 此方法主要参考电动汽车用磷酸铁锂电池SOC估算方法这篇论文 总结: 开路电压的测量需要将电池静止相当长的一段时间才能达到平衡状态进行测量。 安时积分法存在初始SOC的估算和累积的误差。 所以上述两种方法都存在一定的缺陷,因此下面主要讲…...

指针(下)

文章目录 指针(下)野指针、空指针野指针空指针 二级指针**main**函数的原型说明 常量指针与指针常量常量指针指针常量常量指针常量 动态内存分配常用函数**malloc****calloc****realloc****free** **void**与**void***的区别扩展:形式参数和实际参数的对应关系 指针…...

C# 浅谈IEnumerable

一、IEnumerable 简介 IEnumerable 是一个接口,它定义了对集合进行迭代所需的方法。IEnumerable 接口主要用于允许开发者使用foreach循环来遍历集合中的元素。这个接口定义了一个名为 GetEnumerator 的方法,该方法返回一个实现了 IEnumerator 接口的对象…...

mmdebstrap:创建 Debian 系统 chroot 环境的利器 ️

文章目录 mmdebstrap 的一般性参数说明 📜mmdebstrap 的常见用法示例 🌈使用 mmdebstrap 的注意事项 ⚠️ 🌈你好呀!我是 山顶风景独好 🎈欢迎踏入我的博客世界,能与您在此邂逅,真是缘分使然&am…...

【Linux SQLite数据库】一、SQLite交叉编译与移植

SQLite 是一个用 C 语言编写的开源、轻量级、快速、独立且高可靠性的 SQL 数据库引擎,它提供了功能齐全的数据库解决方案。SQLite 几乎可以在所有的手机和计算机上运行,它被嵌入到无数人每天都在使用的众多应用程序中。此外,SQLite 还具有稳定…...

每天写两道(数组篇)移除元素、

27.移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作&#…...

Unity 使用 NewtonSoft Json插件报错

JsonReaderException: Unexpected character encountered while parsing value: . Path , line 0, position 0. 通过断点发现,头有一串ZWNBSP,这个是BOM格式的JSON。在文件下看不到。 解决方法:改编码格式,Remove BOM....

k8s 部署 Mysqld_exporter 以及添加告警规则

最近监控 mysql 数据库,用了 pmm-server、pmm-client 发现监控是真的不太好用,还是用回 prometheus 吧。 部署mysqld_exporter k8s 部署最新版本的 mysqld_exporter,支持的数据库版本 MySQL >5.6、MariaDB > 10.3。 先在数据库创建用…...

基于STM32开发的智能农业环境监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 农田环境监测温室环境控制常见问题及解决方案 常见问题解决方案结论 1. 引言 智能农业环境监测系统通过集成多种环境传感器,实时监测土壤湿度、温度…...

【SQL】平均售价

目录 题目 分析 代码 题目 表:Prices ------------------------ | Column Name | Type | ------------------------ | product_id | int | | start_date | date | | end_date | date | | price | int | ---------------…...

存储器与CPU的连接

1.单块存储芯片与CPU的连接 单独的一块独立的存储芯片提供的线有:地址总线,数据总线,读写控制线,片选线,如果该存储器只有八根数据总线用于输出数据,而cpu一次可以读64位的数据呢? 我们可以将八…...

unity--webgl 访问本地index.html

目录 1:使用本地服务器 1.1 使用 Python 的 SimpleHTTPServer 1.2 使用 Node.js 的 http-server 2:让其他人通过 IP 地址来访问你的 Unity WebGL 项目 2.1: 确保服务器可访问 2.2 获取公共 IP 地址 2.3 配置本地服务器 1.使用 Python 的 SimpleHTTPServer 2…...

慢慢欣赏DPDK RTE_MAX_ETHPORTS的定义

DPDK代码里面,RTE_MAX_ETHPORTS是一个常见的宏定义,但是在.c和.h文件找不到其定义,在全文件搜索条件下,在config/meson.build找到这么一个定义 dpdk_conf.set(RTE_MAX_ETHPORTS, get_option(max_ethports)) 该宏定义是根据构建输…...

Java Nacos与Gateway的使用

Java系列文章目录 IDEA使用指南 Java泛型总结(快速上手详解) Java Lambda表达式总结(快速上手详解) Java Optional容器总结(快速上手图解) Java 自定义注解笔记总结(油管) Jav…...

前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别

前端项目中的Server-sent Events(SSE)项目实践 前言 在前端开发中,实时数据更新是提升用户体验的重要因素之一。Server-SentEvents(SSE)是一种高效的技术,允许服务器通过单向连接将实时数据推送到客户端。下面将从SSE的基本改变,使用场景展…...

《老俞闲话|唯爱和热情不可辜负》读后感

《老俞闲话|唯爱和热情不可辜负》读后感 俞敏洪先生的这篇讲话充满了深情与智慧,他以自己丰富的人生经历和教育实践,向我们展现了一位教育家对于教育事业的热爱和对教师角色的深刻理解。 情感真挚,触动人心 俞敏洪先生的讲话中流…...

C语言 ——— 在杨氏矩阵中查找具体的某个数

目录 何为杨氏矩阵 题目要求 代码实现 何为杨氏矩阵 可以把杨氏矩阵理解为一个二维数组,这个二维数组中的每一行从左到右是递增的,每一列从上到下是递增的 题目要求 在杨氏矩阵中查找具体的某个数 要求:时间复杂度小于O(N) 代码实现…...

DAI-Net: 基于对偶自适应交互网络的药物推荐算法

引言 DAI-Net: Dual Adaptive Interaction Network for Coordinated Medication Recommendation 论文链接:https://ieeexplore.ieee.org/document/10614809 代码链接:GitHub - obananas/DAI-Net 在现代医疗保健中,如何利用电子健康记录&a…...

haproxy高级功能及配置

章节 一、haproxy 基础用法 二、haproxy 高级用法 三、haproxy之ACL的使用 目录 1 基于cookie的会话保持 1.1 cookie命名,并赋予其值 1.2 验证cookie信息 1.2.1 Windows浏览器验证 1.2.2 Linux下虚拟机验证 2 IP透传 2.1 四层与七层透传的区别 2.2 七层IP透传 2.2…...