通俗易懂三大范式

news2024/12/23 19:30:28

通俗易懂三大范式

第一范式说的是每个字段不可再分

第二范式说的是不能存在部分依赖(不能由联合主键的部分就可以推出其他字段,必须整个联合主键才能推出其他字段)

第三范式说的是不能存在间接依赖(A(主键)→B,B→C,A→C,就是存在间接依赖),也就是说非主键字段之间不能存在依赖

能被谁推出,就依赖谁 这句话太牛逼太经典了

首先得理清楚四个概念:依赖,完全依赖,部分依赖,间接依赖

1.什么是依赖关系

img

对于这张表,学生编号+教师编号作为联合主键

由学生编号1001,可以推出学生姓名是张三

由教师编号是001,可以推出教师的姓名是王老师

这种由”一个字段的值可以推出另一个字段的值",我们说这两个字段之间有依赖关系,而且A可以推出B,A->B,则说B依赖于A,能被谁推出,就依赖谁

因为学生编号可以推出学生姓名,所以说学生姓名字段依赖于学生编号字段

教师编号可以推出教师姓名,所以说教师姓名字段依赖于教师编号字段

2.什么是完全依赖关系和部分依赖关系?

联合主键其实是一个集合——(教师学生编号,编号),如果必须学生编号+教师编号(即两个字段的值都必须有)才能推出学生姓名,那我们说学生姓名完全依赖于这个集合(学生编号,教师编号)。但是,这里显然只需要这个集合中的一个子集(仅仅一个学生编号)就可以推出学生姓名了,所以学生姓名这个字段是部分依赖于这个集合(教师学生编号,编号)的。

由此我们可以进行抽象总结:

假如一张表有A,B,C,D,E四个字段,而且主键是(A,B,C),D和E是非主键字段,如果必须A+B+C才能推出D,而(A,B,C)的任何一个子集都无法推出D,就可以说D完全依赖于(A,B,C),如果(A,B,C)的一个子集就可以推出D,则说D部分依赖于(A,B,C)

显然,只有联合主键才会存在完全依赖和部份依赖一说,单一主键没有这么一说。

3.什么是间接依赖?

假设有一个表,里面的字段是学号,姓名,系名,系大楼,

学号可以推出系名,

系名可以推出系大楼,

根据这个关系链可以由学号推出系大楼,就说系大楼字段是间接依赖于学号字段的。

有这样的关系A(主键)→B,B→C,A→C,就是存在间接依赖

但是如果不存在B→C,只有A(主键)→B,A→C就说明不存在间接依赖关系。

也就是说,不存在间接依赖的本质是:非主键之间没有依赖关系,即两个非主键字段之间不存在一个字段可以推出另一个字段的关系!!

4.当你理解完这四个概念,再看什么是三大范式

1.第一范式

必须规定一个字段为主键,而且每个主键都不能再分

2.第二范式

非主键字段必须完全依赖于主键(一般是联合主键而不是单一主键),不能部分依赖于主键

3.第三范式

不能有依赖传递

5.实例讲解

没有分解前的表:

img

sno学生编号和Cname课程名字组成联合主键,存在以下依赖关系:

(1) 学生编号Sno可以推出学生姓名Sname和学生所属学院Sdept,Sno -> Sname, Sdept,也就是学生姓名Sname和学生所属的学院Sdept依赖于学生编号Sno

(2)学生所属学院Sdept可以推出院长的名字Mname,Sdept -> Mname

(3)学生编号Sno+课程名字Cname两个联合主键可以推出学生成绩Grade,Sno, Cname-> Grade

所以,学生成绩Grade完全依赖于联合主键,学生姓名Sname,学生学院Sdept,院长姓名Mname部分依赖于联合主键

第二范式要求非主键字段必须完全依赖于主键(一般是联合主键而不是单一主键),不能部分依赖于主键,这里有字段部分依赖主键,所以不满足第二范式、

将一张表拆分成两张表:

imgimg

表一的主键是学生编号Sno,表二的主键是学生编号Sno和课程姓名Cname组成的联合主键

虽然不再存在部份依赖了,但是表一中存在依赖传递,Sno -> Sdept -> Mname,也就是学生编号无法直接推出院长名字,存在依赖传递违反了第三范式,最后分解成以下两张表:

imgimg

最后每张表中既不存在部分依赖,也不存在间接依赖

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

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

相关文章

wordcloud库和jieba库的使用

文章目录 wordcloud库的简单示范使用wordcloud库报错记录anaconda安装第三方jieba库jieba库的简单示范任务 1:三国演义中的常见词汇分布在“三国"这两个隶书字上,出现频率高的词字体大任务 2:三国演义中出现频率前十的人名。必须是以下这…

【日常总结】windows11 设置文件默认打开方式

一、场景 二、实战 Stage 1:打开设置 Stage 2:应用 > 默认应用 > 搜索 .txt Stage 3:修改成notepad ,设置默认值即可 一、场景 windows 11 .txt 默认记事本打开 需求:如何使用notepad打开呢 ?…

App Inventor 2 低功耗蓝牙(BLE) 硬件接入、数据通信及IO控制

低功耗蓝牙(BLE)以低功耗、低成本、开发简便逐渐被广泛应用,本文主要介绍一款较为通用、价格低廉的BLE设备从零开始如何利用App Inventor 2开发一款自己专属的手机蓝牙App应用。 BLE与经典蓝牙的区别可参考:《低功耗蓝牙(BLE) 和 经典蓝牙(SPP) 的区别》…

一张序列图搞懂resilience4j的工作原理

本文主要回答以下几个问题: Spring Cloud与Resilience4j如何集成的(spring-cliud-circuitbreaker-resilience4j模块的 Resilience4JAutoConfiguration类实现了主要组件的注入,特别是在Resilience4jBulkheadConfiguration中定义如何自定义fac…

Qt简易的五子棋

五子棋是个简单的小游戏,尝试使用Qt将他做出来,学习时的练习demo。 成果展示 需求分析 五子棋:在棋盘上,黑棋先行,交替下棋,五子练成直线获取胜利。 实现过程 1.棋盘绘制:下棋的第一步肯定是绘制…

ubuntu gedit主题更改

ubuntu16.04 gedit 编辑器又有首选项如何设置主题 这里下载主题 将主题XML复制到 /usr/share/gtksourceview-3.0/styles 文件夹内; 使用gsettings 命令设置喜欢的配色方案,使用方式如下:(实测不带.xml后缀哦) gsettings set org.gnome.gedi…

本地配置Joplin Server用于Joplin笔记同步并实现公网远程访问

文章目录 1. 安装Docker2. 自建Joplin服务器3. 搭建Joplin Sever4. 安装cpolar内网穿透5. 创建远程连接的固定公网地址 Joplin 是一个开源的笔记工具,拥有 Windows/macOS/Linux/iOS/Android/Terminal 版本的客户端。多端同步功能是笔记工具最重要的功能,…

小程序定制开发:解析定制化移动应用的未来

引言 在当今数字化时代,移动应用已经成为人们生活不可或缺的一部分。随着智能手机的普及,移动应用的需求呈现出爆发式增长,企业们也纷纷投身于这场数字化浪潮。然而,众多企业在竞争激烈的市场中,如何突显个性、提高用…

uniapp本地存储日志

uniapp本地存储日志 背景实现代码实现使用查看生成log读取 注意事项尾巴 背景 我们的APP开发完成之后,在我们测试环境或者自测的时候都好好的,但是发布到生产环境客户使用总会出现一些奇奇怪怪的问题。这时候因为没在开发环境,我们无法查看到…

【云原生】docker安全与https加密的超文本传输协议CA证书生成

目录 一、docker安全 二、http与https的区别 三、为什么要使用 SSL 证书? 四、https证书认证的过程 https单向认证的访问流程 https双向认证的访问流程 五、如何获取证书? 六、实操获取证书并验证 1、通过阿里云获取证书 2、通过mkcert获取证书…

Flutter的安装与环境配置

一、下载安装Futter: 1、Flutter中文文档: 安装和环境配置 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 2、下载 Futter SDK: Flutter中文文档 里面有,下载完成之后找个文件夹解压出来,最好不要将 Flu…

GoLang和GoLand的安装和配置

1. GoLang 1.1 特点介绍 Go 语言保证了既能达到静态编译语言的安全和性能,又达到了动态语言开发维护的高效率,使用一个表达式来形容 Go 语言:Go C Python , 说明 Go 语言既有 C 静态语言程序的运行速度,又能达到 Python 动态语…

编程实战实例分享,棋牌室计时计费管理系统软件教程

编程实战实例分享,棋牌室计时计费管理系统软件教程 一、前言 以下编程实例以 佳易王棋牌计时计费软件V17.8为例说明 1、开始计时和等待中,图片自动识别,自动匹配 2、开始计时后,系统记录开始时间,并直观显示所用的时…

开源项目MessageNest打造个性化消息推送平台多种通知方式

今天介绍一个开源项目,Message Nest - 可以打造个性化消息推送平台,整合邮件、钉钉、企业微信等多种通知方式。定制你的消息,让通知方式更灵活多样。 开源地址: https://github.com/engigu/Message-Push-Nest 测试平台 系统&am…

网安人必看!CISP家族顶流证书攻略

网络安全已成为当今的热门领域,证书在职业发展中的重要性不言而喻。但是,证书市场五花八门,选择适合自己的证书可是个大问题。别担心,今天我们就来聊聊CISP家族的几个热门认证,让你在网络安全领域的发展更加顺利&#…

Android存储系统基础知识

英文原版链接→ Android存储系统概览图(图片模糊的话请拖动图片至新标签页打开): 从 Android 的角度来看 → 内部存储和 → 外部存储: 内部存储 内部存储只能通过已取得 root 权限的设备进行访问。 应用程序包保存在:…

家政小程序开发

随着人民生活水平的提高,我国老龄化日益增加,越来越多的家庭对家政服务需求也日益提升。目前,家政服务业已经成为了人们日常生活中不可缺少的一部分,家政服务市场具有较大的发展潜力。 近几年,家政服务市场规模呈快速…

驱动开发KMDF编译时:cannot open sourcefile “device.tmh“

有人说 设置项目的 WPP Tracing -> 设置 "Run Wpp Tracing" 为 YES,但是属性页压根没有这玩意啊?咋回事呢? 别人的工程属性页是这样的,这是为什么?

IT运维如何帮助企业降本增效?

IT监控运维管理技术发展应用和趋势 1、智能运维 随着人工智能和大数据技术的发展,智能运维将成为IT监控运维管理的重要趋势。通过利用机器学习、深度学习等技术,实现对IT系统的自动化监控、故障预测和智能维护,提高运维效率和质量。 2、容…

数字化转型对企业发展有哪些帮助?

数字化转型利用技术增强流程、运营和客户体验,在业务发展中发挥着至关重要的作用。以下是数字化转型促进企业发展的一些助力: 1.提高效率和生产力: 日常任务和流程的自动化有助于简化操作,减少完成它们所需的时间和精力。数字工…