【数据库设计】规范设计理论之范式

学习完函数依赖之后我们就可以以函数依赖的定义为依据来规范设计数据库了。范式(normal form)的意思是规范的程度,如第一范式第二范式第三范式,数字越大说明规范程度越高。让数据库满足某一范式实际上是在消除函数依赖的过程,但不是指满足任一范式的数据库就没有了函数依赖。

第一范式1NF

上表中很明显联系方式包含电话和邮箱,经过第一范式设计之后可以变成:

可以看到将原来的属性——联系方式分解成了新的两个属性——手机号、邮箱。因此第一范式要求数据库中每一个属性都不可再分,即每一个属性如原子一般不可再被分割,这是关系数据库种类中对数据库的最低要求。同样,第一范式还要求属性不可重复,因此总结:第一范式要求属性原子化、不可重复。

第二范式2NF

当一个数据库满足了第一范式依旧存在其他问题。比如下表,是满足第一范式的SLC表,属性满足原子化、不可重复。

可以知道该关系的复合主键是(Sno,Cno),其他的非主属性对主键存在各种函数依赖。

考虑下面的问题:

  1. 一个学生不止修一门课,因此当我们单单假如一个学生和课程号的同时,所在系、宿舍都会被重新再写入新的元组中去——冗余
  2. 当新生入学还未选课,但已经分配宿舍和所在系,但Cno作为主键的一部分并不能为空——更新
  3. 当有学生所选的课已经结课,那么在删除Cno的同时,所在系和宿舍也会被删除——删除

这些问题其实很好解决,就是拆表,我们可以看到其实是因为所在系和宿舍跟复合主键(Sno,Cno)存在部分函数依赖,改成完全函数依赖就不会存在冗余、更新、删除的问题了。

拆成下面两个表,就可以消除上面由部分函数依赖带来的问题了。

因此,第二范式实际上是在消除非主属性对候选键的部分函数依赖问题,同时满足第一范式。

第三范式3NF

学生课程表(SC)

Sno (学号)

Cno (课程号)

Cname (课程名称)

2021310721

101

计算机科学导论

2021310722

102

线性代数

2021310723

101

计算机科学导论

可以看到该关系满足第一范式同时不存在部分函数依赖。但依旧存在如下问题:

  1. 有多名学生选择同一个课程,那么在添加课程号的时候需要重复添加相同的课程名称——冗余
  2. 如果某个课程名字需要修改更新,那么很多处有原课程名称的地方都需要修改——修改
  3. 如果有新开设某一门课,但还未有学生选,那么会出现无法插入的情况——插入

这些问题的出现其实是因为非主属性对键存在传递函数依赖,Sno->Cno,Cno↛Sno,Cno->Cname,传递依赖:Sno → Cname,因此为了消除该传递依赖,我们对原关系进行拆解:

学生课程关联表(StudentCourses)

Sno (学号)

Cno (课程号)

2021310721

101

2021310722

102

2021310723

101

课程表(Courses)

Cno (课程号)

Cname (课程名称)

101

计算机科学导论

102

线性代数

因此第三范式是指满足第一、第二范式同时不存在非主属性对候选键的传递函数依赖(要求每一个非主属性都直接函数依赖于候选键)

巴斯-科德范式BCNF

考虑下面关系:每一个老师只教授一门课,每个学生可以选多门课,每门课可以有多个老师教授。

属性之间存在的函数依赖关系是

• (Sno, Cno)→ Tno, (Sno, Tno)→ Cno, Tno → Cno;

• 它的候选键是:(Sno, Cno)和 Sno,Tno

• 主属性是Sno, Cno, Tno

因为没有非主属性,所以该关系满足第三范式,即没有部分函数依赖、传递函数依赖。但依旧存在问题:

  • 由于Tno → Cno,所以当一个老师开了门新课但是还没有学生选择,那么就不能插入——插入
  • 由于主属性Cno 部分函数依赖于候选键(Sno,Tno),(是Tno → Cno)所以:

①当有多名学生选的都是同一个老师的同一门课,那么课程号和老师都需要重复添加——冗余

②当选修CS204这门课的学生毕业了,那么在删除该学生选课记录时会将老师任课信息也都删去——删除。

为了解决该问题——即主属性对候选键的部分函数依赖,我们这样拆解表:

满足了巴斯科德范式,前提是要满足第三范式,只不过加了一个主属性也必须直接函数依赖于候选键,而不存在传递函数依赖,所以也可以这么描述:满足第一范式的基础上,不存在任何属性对候选键的传递函数依赖,此范式和第三范式联系紧密:主要是因为①当一个关系只有一个候选键(一个主属性),而且此关系满足第三范式,那么将自动满足BCNF②当一个关系满足BCNF那么将自动满足第三范式。

到这,如果一个关系已经满足了BCNF,那么说明在函数依赖的范畴里,它的规范程度已经是最高的了,消除了删除异常和插入异常。

第四范式4NF

该范式是在满足BCNF的基础上消除了多值依赖。

上表中,存在多值依赖Sno→→Phone,Sno→→Email,

将其分解之后就得到:

第四范式不允许非平凡的、且非函数依赖的多值依赖,但允许存在非平凡多值依赖(实际上是函数依赖)。

解释:在原关系中,存在多值依赖Sno→→Phone,Sno→→Email,即存在非平凡的多值依赖,同时也是非函数依赖(指一个属性并不单只决定另一个属性值,而是一组),所以将其分解之后, 一个学号可以对应一个手机号,即使一个学生有很多手机号,但是这种元组记录就是函数依赖,因为可以实现一个属性值决定另一个。

总结

日常使用中一般分解到满足第三范式和BCNF,注意:越高范式冗余程度越低,而且高范式在低范式的基础之上。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VisualStudio2022配置2D图形库SFML

文章目录 1. 下载安装SFML库2. 创建C项目并配置SFML配置include目录和库目录链接SFML库配置动态链接库 3. 测试 1. 下载安装SFML库 SFML(Simple and Fast Multimedia Library)C库,适合2D游戏和图形界面,提供了以下模块&#xff1…

Python(pandas库3)

函数 随机抽样 语法: n:要抽取的行数 frac:抽取的比例,比如 frac0.5,代表抽取总体数据的50% axis:示在哪个方向上抽取数据(axis1 表示列/axis0 表示行) 案例: 输出结果都为随机抽取。 空…

MATLAB锂电概率分布模型

🎯要点 概率分布等效电路模型结合了路径相关速率能力及状态估计中滞后效应。纠正了充电状态中时间误差累积及避免开路电压中电压滞后现象。使用电流方向和电池容量相关函数描述开路电压,并使用微分方程描述电压滞后现象。模型结构基于一级相变的材料机制…

2024.10.9华为留学生笔试题解

第一题无线基站名字相似度 动态规划 考虑用动态规划解决 char1=input().strip() char2=input().strip() n,m=len(char1),len(char2) dp=[[0]*(m+1) for _ in range(n+1)] #dp[i][j]定义为以i-1为结尾的char1 和以 j-1为结尾的char2 的最短编辑距离 setA = set(wirel@com) set…

力扣21 : 合并两个有序链表

链表style 描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 节点大小相同时,l1的节点在前 何解? 1,遍历两个链表,挨个比较节点大小 同时遍…

【北京迅为】《STM32MP157开发板嵌入式开发指南》-第六十七章 Trusted Firmware-A 移植

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器,既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构,主频650M、1G内存、8G存储,核心板采用工业级板对板连接器,高可靠,牢固耐…

基于海思soc的智能产品开发(音视频处理的三个方向)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 音视频处理这个需求一直都有,那我们为什么需要soc来处理音视频。或者说,用soc来处理音视频有什么好处?传统的pc…

msvcr100.dll丢失怎样修复,介绍6个简单靠谱的方法

msvcr100.dll是Microsoft Visual C 2010 Redistributable Package中的一个关键动态链接库文件。该文件包含了运行基于Visual Studio 2010编译的应用程序所必需的一系列函数和资源。具体来说,它提供了C运行时库的支持,使得许多使用Visual C库编译的应用程…

雷池社区版compose配置文件解析-mgt

在现代网络安全中,选择合适的 Web 应用防火墙至关重要。雷池(SafeLine)社区版免费切好用。为网站提供全面的保护,帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件,用于定义和管理多个 Dock…

并发编程的深入探索(3/5)

目录 1. Java线程模型 示例代码:创建线程的两种方式 2. 同步机制与锁 示例代码:synchronized的使用 显式锁(ReentrantLock) 3. Java并发工具包(java.util.concurrent) 线程池(Executor F…

gcc与mingw64版本介绍

三类编译器 GCC,全称为GNU Compiler Collection,是一个强大的编译器集合,它不仅支持C和C语言,还支持Fortran、Ada、Java等多种编程语言的编译。在GCC工具链中,gcc和g是两个核心的编译器工具。gcc是专门用于编译C语言程…

PostgreSQL使用clickhouse_fdw访问ClickHouse

Postgres postgres版本:16(测试可用)docker 安装 插件安装 clickhouse_fdw: https://github.com/ildus/clickhouse_fdw 安装命令 git clone gitgithub.com:ildus/clickhouse_fdw.git cd clickhouse_fdw mkdir build && cd build…

【高级IO】IO多路转接之epoll

epoll接口 epoll_create 创建一个epoll模型 自从linux2.6.8之后,size参数是被忽略的返回值是一个文件描述符用完之后, 必须调用close()关闭 epoll_ctl epoll_ctl用于添加、修改或删除关注的文件描述符,并设置感兴趣的事件类型(如读事件、写…

windows 11 mpksldrv.sys 导致蓝屏

#mpksldrv.sys 导致蓝屏 windows 11 在运行Twincat 3进行仿真时,就会蓝屏 尝试了各种其他的办法修改什么注册表,各种办法都尝试了没有用, 后面尝试了下面的办法竟然解决了,请参考下面链接: 链接: 两条命令可以帮助你…

如何使用的是github提供的Azure OpenAI服务

使用的是github提供的Azure OpenAI的服务gpt-4o 说明:使用的是github提供的Azure OpenAI的服务,可以无限薅羊毛。开源地址 进入: 地址 进入后点击 右上角“Get API key”按钮 点击“Get developer key” 选择Beta版本“Generate new to…

WPF+MVVM案例实战(九)- 霓虹灯字效果控件封装实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、运行效果2、主菜单与界面实现1、主菜单2、霓虹灯字界面实现3、字体资源获取3、控件封装1.创建自定义控件2、依赖属性实现3、封装控件使用4、运行效果4、源代码获取1、运行效果 2、主菜单与界面实…

Vulkan 开发(五):Vulkan 逻辑设备

图片来自《Vulkan 应用开发指南》 Vulkan 开发系列文章: 1. 开篇,Vulkan 概述 2. Vulkan 实例 3. Vulkan 物理设备 4. Vulkan 设备队列 在 Vulkan 中,逻辑设备(Logical Device)是与物理设备(Physical D…

Hue3.9.0-cdh5.14.0安装

hue的安装需要准备如下的前置条件 1、Java-jdk8 2、python2.6 3、安装时非root用户 4、另行安装maven和ant,并配置HOME 5、hue安装节点需要hadoop、hive的配置文件 6、准备一个mysql库来做hue的元数据库 第一步:前置准备中的Javajdk和python准备本简单就…

自动驾驶-传感器简述

自动驾驶车辆上的传感器类型包含激光雷达、毫米波雷达、相机、imu、rtk、超声波雷达等,这些传感器用来接收外部世界多姿多彩的信号,根据接收到的信号,车载大脑对信号进行处理,那信号的准确程度就尤为重要。 本文将各个传感器的特性…

OpenCV图像处理方法:腐蚀操作

腐蚀操作 前提 图像数据为二值的(黑/白) 作用 去掉图片中字上的毛刺 显示图片 读取一个图像文件,并在一个窗口中显示它。用户可以查看这个图像,直到按下任意键,然后程序会关闭显示图像的窗口 # cv2是OpenCV库的P…