数据库模式分解(应该比较易懂吧)

2023-11-18

数据库模式分解

部分函数依赖

函数依赖的确定

  1. 1对1的关系时,有两个函数依赖
  2. 1对多时,有一个函数依赖
  3. 多对多时,没有函数依赖

函数依赖类型

右 边 不 为 左 边 的 子 集 { 非 平 凡 函 数 依 赖 ( A − > B ) , y e s 平 凡 函 数 依 赖 ( A B − > B ) , n o 左 边 有 子 集 能 决 定 右 边 { 部 分 函 数 依 赖 , y e s 完 全 函 数 依 赖 , n o 右边不为左边的子集 \begin{cases} 非平凡函数依赖(A->B),yes \\ 平凡函数依赖(AB->B),no \end{cases}\\ 左边有子集能决定右边 \begin{cases} 部分函数依赖,yes\\ 完全函数依赖,no \end{cases} {A>Byes(AB>B)no{,yes,no
传递函数依赖A->B,B->C,此时A—>C就是传递函数依赖

码和主属性

候选码:能够唯一决定一个元组的属性集叫做码

主属性:码里的属性就叫主属性

非主属性:不在码里的属性

超键:码或子集是码的属性集合

候选码求取理论

根据函数依赖,把属性分成四类

L:只在函数依赖左侧

R:只在函数依赖右侧

LR:函数依赖两侧

N:没有出现过的

L、N属性是候选码的子集,若L、N属性的闭包能涵盖全部的元素,则其是唯一候选码

若不能,则从LR元素中于L、N元素进行组合,组合后的元素集的闭包能够涵盖全部元素,即为候选码。

1NF

能写出来的二维表都叫第一范式

2NF

不存在非主属性对码的部分函数依赖(传递函数依赖)

3NF

对每个非平凡依赖,或左边为超键,或右边全部由主属性构成

推论:每一个非主属性,既不部分依赖于码,也不传递依赖于码

分解算法

对所有函数依赖,先将函数依赖集化成最小函数依赖集,只要左边相同,就把他们合并起来,形成的集合作为符合3NF的一个属性集。

例子:
A->B,AB->C,D->AC,D->E

最小函数依赖集:
第一步:先把右边有多个的拆成右边只有一个的
A->B,AB->C,D->A,D->C,D->E
第二步:去除左边的冗余项
因为A->B,AB->C冗余了,所以有B->C
结果为:A->B,B->C,D->A,D->C,D->E
第三步:去除传递函数依赖
D->A->B->C,去除D->C
最终结果为:
A->B,B->C,D->A,D->E


开始3NF的分解
第一步:
找候选码
L:D   R:C,E
N:     LR:A,B
对D求闭包,最终能够包含全部元素集合,因此D是该元素集合的唯一候选码
第二步:于是遵循左部相同合并原则,对其进行合并,形成属性集
R1={A,B}
R2={D,A,E}
R2={B,C}
第三步:查看上述集合有没有包含关系,如果有就吸收合并
显然上面没有
第四步:看分的属性组中有没有包含码,如果有就是无损且保持函数依赖的3NF,没有包含就不是无损且保持函数依赖的3NF,就添加一个属性组,把原来关系的码加进去
最终得到结果为:
R1={A,B}
R2={D,A,E}
R2={B,C}
这三个关系集上的函数依赖均满足3NF的要求

投影算法

假设有关系R(A,B,C,D,E)和FD集{AB->DE,C->E,D->C,E->A},假设要把这些FD投影到S(A,B,C),求出在S上成立的FD集合

第一步:将原来的FD转换成右边只有一个的情况
AB->D,AB->E,C->E,D->C,E->A
第二步:通过直接观察,或传递依赖,找到S(A,B,C)上的函数依赖
AB->D->C 即AB->C
C->E->A 即C->A
所以在S上成立的FD集合为{AB->C,C->A}

BCNF

对于任意一个函数i依赖,左边全为超键,即左边永远能退出整个属性集合。

例子,沿用上一题化最小函数依赖集的结果
A->B,A->C,D->A,D->E

A->B不符合BC范式的要求
对A进行闭包,形成属性集R1 =(A)+={A,B,C}
属性集R2为:U-R1+{A} = {A,D,E}

在R1中的最小函数依赖集为:A->B,A->C ,此时A为这个属性集R1{A,B,C}的码,并且满足BCNF的要求,分解停止
在R2中的最小函数依赖集为:D->A,D->E,此时D为这个属性集R2{A,D,E}的码,并且满足BCNF的要求,停止分解

最终分解成两个属性集:
R1{A,B,C}
R2{A,D,E}
这两个关系集上的函数依赖均满足BCNF的要求,同时也满足3NF的要求。

无损连接的chase检查法

直接上例子

用上面的:

R(A,B,C,D,E)

A->B,A->C,D->A,D->E

R1(A,B,C)

R2(A,D,E)

这个直接列表,每个属性集一行,每行|R|个属性

属性集 A B C D E
{A,B,C} a b c d1 e1
{A,D,E} a b2 c2 d e

在属性集中的元素,就可以直接用小写字母表示,否则则用,小写字母+下标行号表示

根据函数依赖,如果左边的值在表中对应列的值是一致的,右边也应该一致,如果不一致,就向行号小的同步。

如A->B,A列一致,则需要使得B也一致

属性集 A B C D E
{A,B,C} a b c d1 e1
{A,D,E} a b c d e

A->C,A列一致,则C列也应该一致

此时第而行中的数据全为小写字母,这时候就能说明,这种分解方式是无损的。

某个函数依赖的闭包是否属于函数依赖集的闭包

设有关系R(A,B,C,D,E),对应的函数依赖集F={AB->D, AC->E, BC->D, D->A, E->B},
判定
1.函数依赖AE->CD 是否属于F+?▁▁▁(填是或否)
2.函数依赖CD->BE 是否属于F+?▁▁▁(填是或否)

对左边,根据F的函数依赖求闭包,如果左边的闭包 包含{左边+右边}则,说明该函数依赖属于F+

第一题:
(AE)+ = {AEBD} 不包含 {AECD},所以AE->CDu不属于F+
第二题:
(CD)+ = {CDAEB} 包含{CDBE},所以CD->BE属于F+
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库模式分解(应该比较易懂吧) 的相关文章

  • 服务器架构的演进

    服务器端的架构随着公司以及业务的发展 它不断演进 其演进的过程如下 https www cnblogs com joelan0927 p 10425530 html https blog csdn net daogla article de
  • 【数电】如何通俗地理解锁存器和触发器

    目录 一 相关知识 1 三极管和MOS管 2 TTL电路和CMOS电路 3 门电路 4 双稳态电路 二 锁存器 触发器 1 锁存器 2 触发器 1 电平触发的SR触发器 2 电平触发的D触发器 3 边沿触发的D触发器 4 脉冲触发的SR触发

随机推荐

  • java环境搭建图解_Windows7下的Java运行环境搭建过程图解

    单击 Java Download 按钮 选中 Accept License Agreement 单选按钮 我们以Windows 64位操作系统为例 下载Windows X64版的jdk 单击 jdk 8u5 windows x64 exe
  • vue-video-player 一款vue的前端视频播放插件 支持m3u8

    项目进行时 对视频模块需要进行组件开发 结合当前使用的开发框架是vuecli 于是寻找到vue video player 根据github上的文档进行开发 发现并不能实现播放功能 于是在网站上进行寻找发现 vue video player依
  • 3.爬虫之Scrapy框架的安装与使用

    1 Scrapy框架 1 1 介绍 Scrapy是一个开源和协作框架 可以用于数据挖掘 监测 自动化测试 获取API所有返回的数据或网络爬虫 Scrapy是基于twisted框架开发的 twisted是一个流行的事件驱动的python网络框
  • 不用导入animate库,也能实现animate的动画

    1 基础公共代码 animated animation duration 8s 持续时间 animation fill mode both 2 在animate官网 Animate css A cross browser library o
  • Django快速开发(精简版)

    1 使用虚拟环境 workon 虚拟环境名 2 退出虚拟环境 deactivate dajngo框架开发的大体流程 1 创建环境 mkvirtualenv 虚拟环境名 删除 rmvirtualenv 虚拟环境名 virtualenv p u
  • SMTP发送邮件

    SMTP是发送邮件的协议 Python内置对SMTP的支持 可以发送纯文本邮件 HTML邮件以及带附件的邮件 Python对SMTP支持有smtplib和email两个模块 email负责构造邮件 smtplib负责发送邮件 首先 我们来构
  • vue +C# mvc 坑

    1 把input标签放入到form表单中后 再将input中的值新增到数据库后 界面会刷新 解决 删除form 标签 原因待查
  • win11 安装opencv-python

    首先下载python3 7以上版本 installer版本 选择安装pip 添加环境 cmd 打开终端 pip install i https pypi tuna tsinghua edu cn simple opencv python p
  • List集合给另一个List集合赋值问题(即浅拷贝与深拷贝)

    问题 java中将一个list的内容复制给另一个list之后 去新的list进行操作的时候 原来的list也会发生变化 解决方案 直接采用 进行的复制属于浅层赋值 两者指向的使用一个地址 所以操作一个时另一个也会发生变化 如果不想出现这样的
  • 搜索插入位置 JavaScript

    在有序数组中查找 无则插入 元素 返回索引 题目详情 https leetcode cn com problems search insert position description 遍历数组查找 插入 查找比较简单 插入时会麻烦一些 如
  • Java中的String用法

    新手Java程序员了解String类型 1 String是什么数据类型 String在定义上是java lang包下的一个类 它不是基本的数据类型 String是不可变的 JVM使用字符串池来存储所有的字符串对象 2 创建String对象的
  • 阅读书源最新2020在线导入_最最最最最好用的小说神器,全网书源免费用!

    今天给大家分享的是小说软件 为了满足所有小伙伴的需求 今天安卓和苹果都安排上了 一款Android应用 一款iOS应用 两款应用都十分相似 都是可以自行添加书源的软件 几乎覆盖全网小说 阅读 Android 软件本身是没有任何资源的 如果不
  • elasticsearch心得体会

    1 聚合搜索的字段如果是求和的情况下 字段不能为string类型 那么排序时字段要求是不是也一样呢
  • Qt中带token的Http请求

    详细代码 get请求 QTimer timer timer setInterval 5000 设置超时时间 timer setSingleShot true 单次触发 if m pGetManager delete m pGetManage
  • gstreamer中tee如何实现动态增减支路(预览+截图+录像)

    系列文章目录 Gstreamer中获取帧数据的方式 gstreamer中如何使用probe 探针 获取帧数据 gstreamer拉流rtsp使用appsink获取帧数据 预览 截图 gstreamer中如何使用fakesink获取帧数据 预
  • Vue3/ Vue3 生命周期 钩子函数 总结 、Vue3 内 主要 钩子函数 、Vue2 和 Vue3 生命周期钩子函数对比

    一 Vue3 生命周期 钩子函数 总结 1 介绍 Vue组件简介 Vue是组件haul编程 从一个组件诞生到消亡 会经历很多过程 这些过程就叫做生命周期 例如 生命周期就是人出生到入土是一样的 有少年时期 青年时期 中年时期 老年时期 每个
  • Requests

    REQUESTS的基本操作 参考崔庆才爬虫 GET请求 import requests r requests get http www gdsgj com r encoding r apparent encoding 根据从返回内容中解析的
  • 构造函数不能被继承

    构造函数不同于其他类方法 因为他创建新的对象 而其他类方法只是被现有的对象调用 这是构造函数不被继承的原因之一 继承意味着派生类对象可以使用基类的方法 然而 构造函数在完成工作之前 对象并不存在 构造函数不能是虚函数 创建派生类对象时 将调
  • springboot项目获取真实用户ip(不是虚拟ip)

    最近在工作中遇见一个业务场景是获取用户真实的ip地址 就跟现在网上评论展示ip一样的业务场景 然后自己就去了解了一下 1 pom依赖配置
  • 数据库模式分解(应该比较易懂吧)

    数据库模式分解 部分函数依赖 函数依赖的确定 1对1的关系时 有两个函数依赖 1对多时 有一个函数依赖 多对多时 没有函数依赖 函数依赖类型 右 边 不 为 左 边