BCNF与3NF

这篇具有很好参考价值的文章主要介绍了BCNF与3NF。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天学了一下午这个 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的。来看下面这个例子:
BCNF与3NF
对于 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的候选键,就加一个候选键组成的模式文章来源地址https://www.toymoban.com/news/detail-494655.html

到了这里,关于BCNF与3NF的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CAcUiDockControlBar初始位置 2023/8/19 下午3:51:18

    2023/8/19 下午3:51:18 CAcUiDockControlBar初始位置 2023/8/19 下午3:52:00 CAcUiDockControlBar的初始位置是根据其在程序代码中的设置而确定的。通常情况下,它的初始位置可以通过以下几种方式进行设置: 使用Create函数:在创建CAcUiDockControlBar对象时,可以调用Create函数来设置初始位置。通

    2024年02月07日
    浏览(32)
  • 读书笔记--华为数据之道有感

           通过研读华为数据之道,了解到华为作为一家非数字原生企业,其业务涵盖研发、营销、制造、供应、采购、服务等,业务相当复杂。因此华为在开展数据治理过程中明确了由谁来对数据负责,特别是对数据质量负责,明确了数据质量的衡量或度量指标,并成立了数

    2024年02月07日
    浏览(39)
  • 读《mysql是怎样运行的》有感

    最近读了一本书《mysql是怎样运行的》,读完后在大体上对mysql的运行有一定的了解。在以前,我对mysql有以下的为什么: InnoDB中的表空间、段、区和页是什么? redo log为什么就能实现事务的持久性? 到底什么是意向锁?意向锁有什么用? mysql中的外连接、内连接到底是什么

    2023年04月23日
    浏览(18)
  • 软件设计师_软考中级_下午题笔记(已过)

    数据流图分为顶层数据流图和0层数据流图 顶层数据流图只有一个处理节点即某某系统,顶层数据流图是系统和实体的数据传输表示 0层数据流图是将系统细化 一、数据流图的组成 外部实体(起点,终点) 数据流 处理 数据存储 二、数据流图相关原则 1、顶层图和0层图平衡原则

    2024年02月05日
    浏览(69)
  • 啥是 Python?学了他能干嘛?

    最近在学 python,真心感觉这玩意太牛了,你能想到,想不到的事情他都能做,前两天也是总结了一下 python 的特点,分享给大家看看~ 与君共勉 1989年圣诞节,当大家都在忙着包装礼物,享受节日气氛的时候,荷兰人吉多·范罗苏姆却在他的电脑前忙碌着。他决定创造一种新的

    2024年02月12日
    浏览(41)
  • 开源赋能,决胜未来 — 参加原子全球开源峰会有感

    开源原子基金会作为国内首家开源基金会组织,由其主办的首届 “开放原子全球开源峰会” 也是第一次被冠以 “全球开源” 之名,旨在聚焦全球开源发展成果展示,也肩负了将中国开源力量推向世界舞台的历史使命。在这一天紧张而充实的参会活动中确实也让我深刻的体会

    2024年02月10日
    浏览(52)
  • 【程序人生】上海城市开发者社区小聚有感

    📫作者简介: 小明java问道之路 , 2022年度博客之星全国TOP3 ,专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化,文章内容兼具广度、深度、大厂技术方案,对待技术喜欢推理加验证,就职于知名金融公司后端高级工程师。          📫 热衷分享,喜欢原

    2024年02月06日
    浏览(68)
  • 观B站IPv6讲解视频有感

    参考视频链接 B站 电子监听、全国断网,棱镜门背后,中国如何从末路狂奔到世界之巅 硬件不兼容 IPv4 和 IPv6 两个协议之间是不兼容的,所以如果要使用IPv6,必须保证硬件上支持IPv6协议才可以。 可以这样类比理解: 操作系统分为32位和64位,具体是由于所使用的CPU架构不同

    2024年02月02日
    浏览(31)
  • 无刷电机控制基础(2)——有感和无感驱动、调速

    上一篇文章我们讲了一些无刷电机的基础知识,包括无刷电机的内部结构,驱动原理等,我们知道了只需要按照转子的当前位置,来按顺序给定子线圈通电,就能让电机转动起来。 但是,上一篇中我们跳过了一个关键步骤,就是如何检测转子的位置。本篇我们就讲讲常用的位

    2024年01月21日
    浏览(38)
  • 学了Hadoop之后,如何快速理解Spark?

    Apache Spark 是一个开源的分布式计算系统,由加州大学伯克利分校的AMPLab(现在的RISELab)最初开发,旨在 提高大规模数据处理的速度和效率 。Spark 是为了克服 Hadoop MapReduce 模型在某些数据处理任务上的局限性(如迭代算法和交互式数据挖掘任务)而设计的。Spark 提供了一个强

    2024年03月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包