第八章:关系数据库设计

news2024/10/1 3:21:15

一、范式

一、BC范式(BCNF)

(1)定义

BC范式可以消除所有利用函数依赖发现的冗余

范式是对于关系模式而言的,即可以说关系模式R是一个范式。

因此对于BC范式,它需要满足的条件是,对于它的所有函数依赖α→β至少有以下之一:

(2)分解不属于BC范式的模式

如果R中存在一个非平凡的函数依赖α→β,且α不是超码。则我们需要用以下两个模式取代R

①由于α可以决定β,我们提取出一个以α为超码的关系,它包含α和β的属性。

②原来的R保留α中的不同于β的部分,其余β部分去掉,我们想保留另一个关系的主码。以便于自然连接无损。

这种分解是无损连接分解,因为②中保留了①中的超码,因此自然连接时可以有足够的信息。但是①和②都不一定是BC范式,可能需要进一步分解,但最终不能分解时则全都是BC范式。(比如①中若仍然有非平凡依赖β→γ,而超码是α,不是β)。

缺点:可能在分解的过程中可能不能保持依赖,即分解后两个关系的依赖 重新合并在原关系下 也推导不出原来的全部函数依赖。

(3)How good is BCNF?

如下关系模式:

(employee_id,dname,phone_number),若一个id为999-99-9999的雇员,有两个亲属分别为“David”和“William”,有两个电话号码。可以发现这是一个只有平凡依赖的关系模式,因此是BCNF范式,但是这样的合并相当的冗余。比如我们要为其加入一个新电话,那么需要加两个元组,分别包含两个亲属的名字。

因此我们需要更高的函数依赖。

(4)保持依赖

只能降低规范化标准:第三范式

二、第三范式(3NF)

(1)定义

对于第三范式,它需要满足的条件是,对于它的所有函数依赖α→β至少有以下之一:

        可以看出BC范式一定满足前两个,所以BC范式一定是第三范式,但是第三范式不一定是BC范式,第三范式属于是BC范式为了保持原来的函数依赖降低了要求。

        第三个条件是BC范式保持函数依赖的最小松弛(放宽)

二、函数依赖理论

一、函数依赖集的闭包

(1)定义

对于给定关系模式R,R上的依赖集F,F所逻辑蕴含的(F所能推导出的)所有函数依赖的集合\displaystyle F^+,称为F的闭包。

(2)计算(用函数依赖 推导 其蕴含的函数依赖)
①阿姆斯特朗公理

注意:αβ指的是α∪β(属性集的并集),所以αα=α

阿姆斯特朗公理可以推导出F的闭包,但是相当麻烦。(不会要求计算F的闭包)

②更简化规则

要求证明

1°合并律:

        增补律:由α→β,可得α→βα

                       由α→γ,可得βα→βγ

        传递律:由α→βα和βα→βγ,可得α→βγ

2°分解律:

        自反律:由β、γ均包含于βγ,可得βγ→β,βγ→γ

        传递律:由α→βγ,及βγ→β,βγ→γ,可得α→β、α→γ

3°伪传递律:

        增补律:由α→β,可得αγ→βγ(βγ=γβ 并集!)

        传递律:由αγ→βγ,γβ→δ,可得αγ→δ。

注:

        左边→右边,左右两边同时包含的,右边的可以去掉,因为自己一定知道自己。另外,右边直接加上左边的也是可以的(满足增补律,也满足自己知道自己)。

        并且左边→右边,在左边加上任何属性,仍然有左右∪{**}→右边,因为对于一个元组而言已知这个左边的信息就已经确定了它这个右边的信息,再加上一些信息,它还是可以确定这个右边的信息。(实际上是自反律和传递律,左右∪{**}→左边→右边)

        比如A→B, 则可以有 A→AB,AG→B。

③枚举所有属性集,求其闭包,列出所有函数依赖求解

二、属性集的闭包

(1)定义

在函数依赖集F下由α函数确定的所有属性的集合为F下α的闭包,记作\alpha ^+

F是能确定关系R所有函数依赖的函数依赖集,这样才有意义。所以α的闭包是α在R中,一旦一个元组的α确定,它所能确定的R中的属性。

(2)计算方法

具体来说就是,首先α属性进入result集合,扫描函数依赖集F,对于每一条函数依赖,若其左部的属性包含在result中,则将右部的新属性加入result,依此下去,循环扫描直至没有更新。

(3)属性集闭包的用途

对于关系R中的属性集α的闭包

1°可以判定α是否是超码,只要它的闭包包含了所有属性,则α是超码。(候选码需要再判断)

2°检验是否有α→β成立,只要β包含于\alpha ^+即可。

3°用于计算函数依赖集F的闭包:

对于R的任意非空属性集,计算其闭包,然后即可得到以该属性集为左部的所有函数依赖。

由于左部包含了任意R的非空属性集,则所有R的函数依赖都包含了,即F的闭包求出来了。

三、正则覆盖

(1)定义

F的正则覆盖Fc是一个依赖集,并且他们互相蕴含。满足:

即Fc是关系R上的最简化函数依赖集,不包含冗余部分,F和Fc具有相同的闭包。

正则覆盖不一定唯一。

(2)无关属性

对于F中的函数依赖α→β:

去掉要检验的属性A后,得到的新依赖集F',

若A在左部,判断F是否蕴含F'   (即F能否推出α-{A}→β)

若A在右部,判断F'是否蕴含F   (即F’能否推出α→A)

计算方法:

(3)正则覆盖的计算方法

删除后若为空,则删除该函数依赖,换句话说如果一个函数依赖的右部只有一个属性,它也可能是无关属性。

在检验时用的是当前Fc上的函数依赖,本质就是Fc当做F,Fc删除后的当做F',没什么区别。

四、无损连接分解

如果R1和R2是R的无损连接分解,如果以下函数依赖中至少有一个属性F的闭包:

即分解时,分解后的共同部分是某一个关系的超码,那么在自然连接时就可以通过这个超码唯一确定元组。(BC范式就满足这样的分解)

注:这是一个充分非必要条件,无损连接分解不一定满足该条件,只有当所有约束都是函数依赖的时候才是一个充要条件。

        没有保持依赖的性质。

五、保持依赖

(1)定义

即分解后的属性集合R1,R2……,Rn,在F闭包上只包含Ri的所有函数依赖集F1,F2……,Fn,它们的并集在R上能够蕴含F。

例如:
inst_dept(ID,name,salary,dept_name,building,budget)的函数依赖F集有

{ID->R,dept_name->building,budget};

分解为

instructor(ID,name,salary,dept_name)    F1={ID->ID,name,salary,dept_name}

department(dept_name,building,budget)  F2={dept_name->building,budget}

F1∪F2 的闭包显然蕴含F,即F1∪F2的闭包与F的闭包相同

则该分解是保持依赖的,同时这分解后也是两个BC范式。

(2)计算方法

对于F上的每一个α→β使用:

本质上求的是α在F'上的闭包,判断其闭包是否包含β,包含的话则α→β是被保持的。

但是计算时并未求F',而是利用其等价方式求解

result表示到目前为止α能够推导出的属性集合,

对于每一个Ri,求result∩Ri在F上的闭包 ,其闭包再与Ri相交得到t,t并入result继续求解,这个求解过程和求result∩Ri在Fi上的闭包是一样的。

考虑如下(乱):求result∩Ri在F上的闭包 无异于 求result∩Ri在F闭包 上的闭包,求解时把F闭包分为两部分,一部分函数依赖左部只包含result∩Ri的属性(这一部分求解的闭包∩Ri和 result∩Ri在Fi上的闭包是是一样的),另一部分左部不止包含这些属性(这一部分求解出的另外的闭包若不是Ri中的属性其实可以由后续循环得到)

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

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

相关文章

网络安全工程师自主学习计划表(具体到阶段目标,保姆级安排,就怕你学不会!)

前言 接下来我将给大家分享一份网络安全工程师自学计划指南,全文将从学习路线、学习规划、学习方法三个方向来讲述零基础小白如何通过自学进阶网络安全工程师,全文篇幅有点长,同学们可以先点个收藏,以免日后错过了。 目录 前言…

Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。

一、执行ls -l /system/bin/ 查看一下用户和权限。 二、这些权限在哪里修改呢? 默认编译system/bin/可执行程序赋予权限的地方system\core\libcutils\fs_config.cpp 文件里面的android_files 三、使用实例,只有root和系统app权限才能执行某个命令,如上面的sn_writer命令,只…

【算法刷题】【链表】链表内指定区间反转:将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n),空间复杂度)O(1)。

题目 解题 import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回…

正点原子嵌入式linux驱动开发——Linux内核启动流程

上一篇笔记学习了Linux内核的顶层Makefile,现在来看Linux内核的大致启动流程,Linux内核的启 动流程要比uboot复杂的多,涉及到的内容也更多,因此本章就大致的了解一Linux内核的启动流程。 链接脚本vmlinux.lds 要分析Linux启动流…

2023高交会“创新驱动发展·智慧赋能未来”招商工作已接近尾声

第二十五届中国国际高新技术成果交易会(简称“高交会”)将于2023年11月15日至19日在深圳会展中心举行。本届高交会以“创新驱动发展智慧赋能未来”为主题,聚焦战略性新兴产业和未来产业,集中展示中国高新技术成果和创新实力。 作为…

什么是基于意图的网络(IBN)

基于意图的网络是一种网络技术,它根据业务意图(来自网络管理员的服务请求)配置 IT 基础架构,无需任何人工干预,它不断提供关键的网络见解,并不断调整硬件配置以确保满足意图,它将网络从以设备为…

Java练习题-用冒泡排序法实现数组排序

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java练习题 💬个人格言:不断的翻越一座又…

超详细!Android Termux上如何安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一个随身…

C++游戏后端开发(魔兽世界,MMO,TrinityCore源码拆解) 教程

基于魔兽开源后端框架 TrinityCore 的技术拆解课程 一、TrinityCore CMake项目构建 1.1 CMake的使用 什么是CMake , CMake 的工作流程 CMakeLists.txt的编写规则 静态库生成以及链接 动态库生成以及链接 嵌套CMake 1.2 Windows和Linux下编 译调试环境搭建 cmake和grap…

Android原生实现控件outline方案(API28及以上)

Android控件的Outline效果的实现方式有很多种,这里介绍一下另一种使用Canvas.drawPath()方法来绘制控件轮廓Path路径的实现方案(API28及以上)。 实现效果: 属性 添加Outline相关属性,主要包括颜色和Stroke宽度&…

桌面动态壁纸

1、将压缩包中解压,选择所需要的壁纸复制到目录 2、解压kugou动态壁纸运行程序,文件选择默认打开文件为animation_desktop_webgl.exe 3、重启电脑生效

【总结】kubernates 插件工具总结

在此记录工作中用到的关于 kubernates 的插件小工具,以防以后忘记 1、能显示 kubernates 所处上下文的插件 kube-ps1 github 地址: https://github.com/jonmosco/kube-ps1 效果 2、能方便切换 kubernates 上下文的插件 kubecm github 地址&#xff1…

Python中跨越多个文件使用全局变量

嗨喽,大家好呀~这里是爱看美女的茜茜呐 这个琐碎的指南是关于在 Python 中跨多个文件使用全局变量。 但是在进入主题之前,让我们简单地看看全局变量和它们在多个文件中的用途。 👇 👇 👇 更多精彩机密、教程&#xff…

流程引擎概述及组成

一、流程引擎概述 流程,可以理解为步骤,一个有序的活动或动作; 引擎,可以理解为驱动,是一个程序或者一套系统。 所以,字面意思可以理解为,流程引擎是一套(或一个)用来…

Java 线程的生命周期

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:程序员老茶 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,…

笔记38:膨胀卷积/空洞卷积的原理

本地笔记:D:\work_file\DeepLearning_Learning\03_个人笔记\膨胀卷积 a a a a a a a a a a a a a a a

如何为金蝶ERP软件配置自定义域名,并实现公网访问——“cpolar内网穿透”

文章目录 前言1. 保留自定义域名2. 域名解析3. 配置自定义域名4. 关于服务器选择以及域名备案的说明4.1 关于服务器地区的选择:4.2 关于自定义域名备案:4.3 关于域名过白名单: 前言 上篇文章我们讲过如何安装金蝶云星空,实现异地…

JavaScript语法(一)

一、什么是JavaScript 1、DOM 文档对象模型(Document Object Model)是一个应用编程接口(API),用于在HTML中使用扩展的XML,DOM 将整个页面抽象为一组分层节点。HTML 或 XML 页面的每个组成部分都是一种节点…

线程安全问题 --- 死锁

文章目录 线程安全产生线程安全问题的原因上锁synchronized使用方法1. 修饰方法2. 修饰代码块synchronized的可重入性死锁什么是死锁死锁的三个典型情况:死锁的四个必要条件如何破除(避免)死锁线程安全类线程安全 由于多个线程之间是抢占式执行的, 这就给调度执行顺序带来了随…

Redis(三)

文章目录 一、单节点Redis的问题(一)数据丢失(二)并发能力问题(三)存储能力问题(四)故障恢复问题 二、Redis持久化(一)RDB1、RDB是什么2、rdb配置3、手动触发…