热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

第7章关系数据库理论

系列文章目录第6章数据库建立与管理文章目录系列文章目录前言一、基本概念函数依赖二、范式1.常见范式定义2.判定关系属于哪个范式3.最小化函数依赖集三、模式分解0.简单分解方法1.准
系列文章目录

第6章 数据库建立与管理

文章目录

  • 系列文章目录
  • 前言
  • 一、基本概念
    • 函数依赖
  • 二、范式
    • 1.常见范式定义
    • 2.判定关系属于哪个范式
    • 3.最小化函数依赖集
  • 三、模式分解
    • 0.简单分解方法
    • 1.准则
    • 2.保持函数依赖的3NF的分解
    • 3.既有无损连接性又保持函数依赖的3NF分解
    • 4.BCNF的无损连接的分解
  • 总结
前言

判断关系属于哪个范式、关系模式的分解

一、基本概念

函数依赖

依赖:一个属性的值可以决定另一个属性的值

  • 非平凡的函数依赖:X→Y,但Y不包含于X
  • 平凡的函数依赖:X→Y,X包含Y
  • 完全函数依赖:X→Y,且X的真子集均不能推出Y(必须完整的X才能推出Y)
  • 传递函数依赖:X→Y,Y→Z且X不包含Y,Y不能推出X,Z对X传递函数依赖
二、范式

1.常见范式定义

1NF/第一范式
定义:所有属性均不可分解
2NF/第二范式
定义:关系属于第一范式,且所有非主属性完全依赖于码
3NF
定义:所有的非主属性完全依赖于码,且不传递依赖于码
每一列数据都与主键直接相关,不能间接相关
BCNF
定义:非主属性对码都是完全函数依赖;主属性对不包含它的码是完全函数依赖;没有属性完全依赖于非码属性
消除传递依赖

2.判定关系属于哪个范式

从BCNF开始,找是否存在不满足的条件,依次降低范式等级

  • 找候选码
  • 是否存在非主属性部分依赖于码(码的真子集就能推出它)——存在则不满足2NF
  • 是否存在非主属性传递依赖于码——存在则不满足3NF,为2NF
  • 以上均满足,找主属性是否有传递依赖于码、是否有部分依赖于码——存在则非BCNF

3.最小化函数依赖集

  1. 拆右边为多个元素的 ⽐如A->BC 拆为 A->B 和A->C
  2. 对每个依赖:除去当前依赖,求它左边的元素的闭包,若依赖右边的元素包含于左边元素的闭包,则去掉该依赖
  3. 左边最小化(通过遮住左边某个元素来看其余左边元素能不能推出该元素)
    例:对依赖BCD→A,BCD 遮住B看CD能否推出B,能就去掉B

例:已知关系 R, U{A,B,C,D,E,F,G} F={BCD->A,BC->E,A->F,F->G,C->D,A->G} 求F的最小依赖集

  • 右边均为单元素
  • 去除冗余依赖:
    对BCD→A:
    除去依赖BCD→A,BCD能推出E、D,故BCD闭包为BCDE,不包含A,保留该依赖
    同理BC→E:BC闭包为BCDAFG,不包含E,保留
    A→F:A的闭包为AG,不包含F,保留
    F→G:F闭包为F,不包含G,保留
    C→D:C闭包为C,不包含D,保留
    A→G:A的闭包为AG,包含G,除去
  • 去除左边冗余
    BCD→A:去除B,CD不能推出B,保留B
    去除C,BD不能推出C,保留C
    去除D,BC能推出D,去除D,改为BC→A
    BC→E:去除B,C不能推出B,保留B
    去除C,B不能推出C,保留C

所以F的最小依赖集为{BC→A,BC→E,A→F,F→G,C→D}

三、模式分解

0.简单分解方法

分解成3NF的快速准则:
有一个函数依赖就单独组成一个关系

分解成BCNF的快速分解规则:
将函数依赖集中左边不含码的函数依赖单独组成一个关系,包含码的组成一关系

1.准则

  • 保持函数依赖
  • 无损连接性:分解前后连接结果相同

2.保持函数依赖的3NF的分解

  1. 求出最小函数依赖集Fmin
  2. 把不再函数依赖集F内的元素找出,单独分一类并从U中除去
  3. 把Fmin中每一个左边元素相同的依赖元素分成一类。A→B,A→C=={ABC};没有一样的,就把A→D改成{AD}

例:已知R(ABCDEGH) ,F={A→D,E→D,D→B,BC→D,DC→A} ,求保持函数依赖的3NF的分解

  1. 最小函数依赖集{A→D,E→D,D→B,BC→D,DC→A}
  2. GH不在F内,单独一类{GH}
  3. Fmin中:没有左边相同的,故{AD},{ED},{DB},{BCD},{DCA}

故满足条件的分解为ρ={GH,AD,ED,DB,BCD,DCA}

3.既有无损连接性又保持函数依赖的3NF分解

先进行保持函数依赖的3NF分解,得到ρ={U1,U2,U3,…}
找出关系的码。若任意一个候选码没被ρ中的任何一个Ui包含,则任意一个候选码分为一类,否则不变。

例:已知R(ABCDEGH) ,F={A→D,E→D,D→B,BC→D,DC→A} ,求既有无损连接性又保持函数依赖的3NF的分解

  1. 保持函数依赖的3NF分解:ρ={GH,AD,ED,DB,BCD,DCA}
  2. 关系的码:{CE},没有被ρ中元素包含,单独一类

故分解结果为τ={ CE,GH,AD,ED,DB,BCD,DCA}

4.BCNF的无损连接的分解

要求满足无损连接性:

  1. 将U中所有元素加入集合ρ
  2. 检查关系模式中各关系是否均属于BCNF,若是,则计算终止
  3. 若某个Ri不属于BCNF,找一个服从BCNF的关系Rj作为S1,其余关系所包含属性元素集合作为S2,将R拆成S1、S2两部分。判断S2是否属于BCNF,是则停止,否则同样方法拆分S2
总结

《第7章 关系数据库理论》


推荐阅读
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Vue 2 中解决页面刷新和按钮跳转导致导航栏样式失效的问题
    本文介绍了如何通过配置路由的 meta 字段,确保 Vue 2 项目中的导航栏在页面刷新或内部按钮跳转时,始终保持正确的 active 样式。具体实现方法包括设置路由的 meta 属性,并在 HTML 模板中动态绑定类名。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
author-avatar
魂牵夢绕的思念丶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有