BCNF与3NF

news2024/9/21 16:50:01

今天学了一下午这个 B C N F BCNF BCNF 3 N F 3NF 3NF,有感而发,特来总结。好像好久不打键盘了,这手好像刚长出来的一样。本文浅显的分析一下两种范式的关系与不同以及判断方法和分解算法,以做总结。
B C N F BCNF BCNF范式的定义如下:
设属性集合 U = { A , B , C , D , . . . , } U= \left\{ A,B,C,D,...,\right\} U={A,B,C,D,...,},函数依赖集合 F = { f 1 , f 2 , . . . , } F=\left\{f_{1},f_{2},...,\right\} F={f1,f2,...,},其中 f 1 f_{1} f1形如 A → B A\rightarrow B AB.如果模式 R = ( U , F ) R=(U,F) R=(U,F)满足 B C N F BCNF BCNF范式,则应该有对于任意一个 f i = H 1 → H 2 f_{i}=H_{1}\rightarrow H_{2} fi=H1H2来说, H 1 H_{1} H1应该满足以下两个条件:

  1. H 1 H_{1} H1为超键
  2. 该依赖是平凡的( H 2 H_{2} H2 H 1 H_{1} H1的子集)

这是为了防止有某个函数依赖 B → A B \rightarrow A BA出现,其中 B B B不是超键,在此基础上我们来看 3 N F 3NF 3NF的定义:
其与 B C N F BCNF BCNF的差别为 3 N F 3NF 3NF加入了第 3 3 3

  • 每一个在 H 2 − H 1 H_{2}-H{1} H2H1中的属性都应该被某个候选键所包含

这里注意一个小细节,虽然第 3 3 3点是这样说,但是实际操作时对于一个函数依赖 α → β \alpha \rightarrow \beta αβ判断其是否是 3 N F 3NF 3NF的,首先要看 α \alpha α是否是超键,如果不是超键就要看 β \beta β中的每个属性是否包含于 F F F的某个候选键当中。那么问题来了,问什么要加入这个奇怪的第 3 3 3条?其原因就是不让某个非主属性引起函数依赖的传递。
接下来说一下BCNF的分解方法
对于一个不是 B C N F BCNF BCNF的模式来说,遍历其所有的函数依赖,检查其是否满足上面那两条,如果不满足,就将当前模式分解为 R 1 = ( α , β ) R1=(\alpha,\beta) R1=(α,β), R 2 = ( R − ( β − α ) ) R2=(R-(\beta-\alpha)) R2=(R(βα))。分解完成之后,还要看 R 2 R2 R2是否是满足 B C N F BCNF BCNF的:如果满足算法停止,否则继续对 R 2 R2 R2进行分解,在 R 2 R2 R2上检查 B C N F BCNF BCNF时,一定要在 F F F的闭包 F + F^{+} F+上看其是否是 B C N F BCNF BCNF的。来看下面这个例子:
在这里插入图片描述
对于 R 2 R_{2} R2来说,应该先看 R 2 R_{2} R2上的函数依赖的左部有没有 R 2 R_{2} R2上的候选键。但是 F F F中没有关于 R 2 R_{2} R2的函数依赖,所以应该先求 F F F的闭包。在 F F F的闭包中有一个函数依赖为 A C → D AC \rightarrow D ACD,而 A C E ACE ACE为候选键,所以这一定不是 B C N F BCNF BCNF,继续向下分解为 R 3 = ( A , C , D ) R3=(A,C,D) R3=(A,C,D), R 4 = ( A , C , E ) R4=(A,C,E) R4=(A,C,E)

我们来回顾一下 B C N F BCNF BCNF的分解方法:

  1. 其分解的时候保证了无损连接
  • 无损连接是啥?就是一个模式 R R R拆分成了 R 1 R_{1} R1 R 2 R_{2} R2之后,经过 R 1 R_{1} R1 R 2 R_{2} R2自然连接,又能转换回 R R R,前后 R R R中的行不多不少
  • 为什么保留了无损连接?保留无损连接的条件是: R 1 ∩ R 2 → R 1 R_{1}\cap R_{2} \rightarrow R_{1} R1R2R1 R 1 ∩ R 2 → R 2 R_{1}\cap R_{2} \rightarrow R_{2} R1R2R2 这两个条件满足其一即可。对于 B C N F BCNF BCNF拆出的 R 1 R_{1} R1 R 2 R_{2} R2其公共部分就是 α \alpha α,而 R 1 R_{1} R1( α , β ) \alpha,\beta) α,β)就已经满足了 R 1 ∩ R 2 → R 1 R_{1}\cap R_{2} \rightarrow R_{1} R1R2R1 这个条件。
  1. 但是不能保证函数依赖都被留下。
  • 为什么不能保证留下函数依赖?考虑这个例子: U = { A , B , C , D } U= \left\{ A,B,C,D\right\} U={A,B,C,D}, F = { A → C , B → C D } F=\left\{A\rightarrow C,B\rightarrow CD\right\} F={AC,BCD}, A A A不是候选键,分解为 ( A , C ) (A,C) (A,C) ( A , B , D ) (A,B,D) (A,B,D),则 B → C D B\rightarrow CD BCD这个依赖一定保留不下来。
  • 为什么一定要保留函数依赖?现在 R 1 R_{1} R1 R 2 R_{2} R2是无损连接,假设有一个依赖 A → B A\rightarrow B AB这个依赖没有被保留下来,现在向 R 1 ( 有 A 没 B ) R_{1}(有A没B) R1(AB)插入一行 A A A,向 R 2 ( 有 B 没 A ) R_{2}(有B没A) R2(BA)插入一行 B B B,在自然连接回去就会产生错误。

写到这里就不得不说一下 B C N F BCNF BCNF 3 N F 3NF 3NF的关系了,首先来看一个例子:
设有一个属性集合 U = { J , K , L } U= \left\{ J,K,L\right\} U={J,K,L},其函数依赖集合为 F = { J K → L , L → K } F=\left\{JK\rightarrow L,L \rightarrow K\right\} F={JKL,LK},先看候选键,其左部属性为 J J J,双部属性为 K , L K,L K,L,又发现 J K JK JK J L JL JL可以作为候选键,由于 L → K L \rightarrow K LK不满足 B C N F BCNF BCNF的定义,所以必须按照 B C N F BCNF BCNF分解算法将其分解,但是我们注意到不论如何分解, J K → L JK\rightarrow L JKL这个函数依赖一定不会被保留下来。所以 B C N F BCNF BCNF虽然可以做到无损分解,但是不能保证能保留下函数依赖。所以放宽 B C N F BCNF BCNF的条件,如果能满足第 3 3 3点,我们就将其称为好的 3 N F 3NF 3NF
下面说 3 N F 3NF 3NF的分解算法:算出 F F F的正则覆盖 F c F_{c} Fc,然后按照正则覆盖里的所有模式进行分解,如果最后没有原来 F F F的候选键,就加一个候选键组成的模式

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

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

相关文章

linux 常用指令大全

目录一、基本指令指令基本格式1、ls1.1 ls相关选项2、pwd3、cd4、mkdir4.1、mkdir相关选项5、touch6、cp6.1 cp相关选项7、mv8、rm8.1、rm相关选项9、输出重定向10、cat11、df11.1、df 相关选项12、free12.1、free 相关选项13、head13.1、head相关选项14、tail14.1 tail相关选项…

day13 二叉树 | 144、二叉树的前序遍历 145、二叉树的后序遍历 54、二叉树的中序遍历

二叉树基础 二叉搜索树 二叉搜索树是一个有序树。 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树 下面这两棵…

零食商城|基于springboot的零食商城

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

GuLi商城-简介-项目介绍、分布式基础概念、微服务架构图

一、项目简介 1 、项目背景 1 )、电商模式 市面上有 5 种常见的电商模式 B2B、B2C、C2B、C2C、O2O; 1 、 B2B 模式 B2B (Business to Business), 是指商家与商家建立的商业关系。 如:阿里巴巴 2 、 B2C 模式 B2C (Business…

Win7安装高版本的NodeJS方法,亲测可用

Win7安装高版本的NodeJS方法 正常情况下,Win7所能支持的Node.js最高版本为:V13.14,在开发过程中,git下来的项目由于node版本比较高的原因,好多package都不能还原或出现诸多警告 网络大神分享的安装高版本的方法: 1、…

Express 通过 CORS 或 JSONP 解决跨域问题

文章目录参考描述同源策略同源同源策略示例CSRF 攻击解决跨域问题CORSCORS 响应头部Access-Control-Allow-Origin简单请求预检请求预检请求包含的两次请求解决CORS 中间件使用 CORS 中间件处理跨域请求JSONP通过原生 JS 向服务器端发起 JSONP 请求通过 jQuery 向客户端发起 JSO…

mysql:如何在windows环境下配置并随意切换两种mysql版本

系列文章目录 文章目录系列文章目录前言一、去官网下载zip安装包二、配置创建my.ini文件2.环境变量3、使用管理员身份打开dos命令窗口4、安装mysql8的服务和初始化data5、启动6 错误解决:修改mysql8服务的注册表最后前言 之前安装过5.7的版本 后来由于需要 就安装了…

天龙八部TLBB从0到1搭建教程-上

服务器的配置选择与购买 我们需要准备的东西,是环境安装和4核8G的服务器一台。 其实购买服务器的地方很多以下这些服务商都可以,具体看服务器的配置选择,像这种4核8G的 服务器价格在260-400之间一台仅供参考,当然还有带防的服务器价格就偏高了阿里云、腾讯、百度、西部数码…

年后公司新来一00后卷王,我们这帮老油条真干不过.....

都说00后躺平了,但是有一说一,该卷的还是卷。这不,我们公司来了个00后,工作没两年,跳槽到我们公司起薪18K,都快接近我了。后来才知道人家是个卷王,从早干到晚就差搬张床到工位睡觉了。 2023年春…

MySQL深分页 + 多字段排序场景的优化方案【三百万级数据量】

需求背景 目前产品需要针对一个大范围地区内的所有用户做排行榜功能,且这个排行榜有几个比较蛋疼的附加需求: 排行榜需要全量展示所有用户,且做分页展示(大坑💥) 排行榜有4种排序条件,且每个排…

fatal error怎么解决,有什么快捷的解决方法

fatal error怎么解决,其实是有多种的解决方法的,主要是看你想用哪种解决方法去进行解决,下面一起来看看。 一.fatal error的解决方法 1、按winR,弹出运行窗口。 2、输入regedit点击确定,弹出注册表编辑器。 3、在注…

2023年数据库优化顶级原理

毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论,能让大家快速、准确的去选择出合适的优化方案,我相信…

Acwing-1116. 马走日

本题求有多少路径遍历棋盘上的所有点,属于外部搜索,所以需要回溯。另外,对于递归终止条件,我们添加一个参数用来表示当前遍历到第几个点,如果是n*m表明已经将棋盘遍历一遍了,方案数1,return即可…

Linux常用命令——screen命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) screen 用于命令行终端切换 补充说明 Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是…

Linux学习笔记本(不定期持续更新)

一、概述 2023年,打算系统自学一遍Linux,分享到这里来,和大家一起相互学习,探讨。 二、Linux基础知识 Linux学习环境搭建学习每一门技术,系统环境很重要,好的系统环境能够极大提高学习效率。学习Linux也是一…

33. 实战:实现某网站店铺信息的查询与批量抓取(附源码)

目录 前言 目的 思路 代码实现 1. 请求URL,获取源代码 2. 解析源代码,获取数据 3. 完善保存数据的函数save_data 4. 理清main函数逻辑,循环传递每一页有效信息的参数 完整代码 运行效果 总结 前言 近日,我们每周四都能…

ESP-C3入门5. 使用通用计时器

ESP-C3入门5. 使用通用计时器一、 简介二、使用步骤三、操作函数1. 基本操作(1)定时器实例 gptimer_handle_t (2) 定时器配置结构体 gptimer_config_t(3) 定时器初始化 timer_init()(3&#xff…

探索 Vue.js 中引用的力量:访问和操作 DOM 元素”

0.简介 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它由 Evan You 于 2014 年创建,此后作为构建 Web 应用程序的工具越来越受欢迎。 Vue 的核心特性包括: 反应式数据绑定:Vue 使用反应式系统来跟踪对数据模型的更改并自动更新…

22年部署之docker学习

以下记录的是,我在学习中的一些学习笔记,这篇笔记是自己学习的学习大杂烩,主要用于记录,方便查找https://hub.docker.com/ 镜像中心Docker 常用命令: docker 运行相关运行: service docker start停止&#…

【三年面试五年模拟】算法工程师的独孤九剑秘籍(前十二式汇总篇)V1版

写在前面 【三年面试五年模拟】栏目专注于分享AI行业中实习/校招/社招维度的必备面积知识点与面试方法,并向着更实战,更真实,更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优化ideas,一起交流学习💪 大家好&a…