6.1 问题的提出

关系模式是一个5元组
R U,D,DOM,F
U 属性
D 域
DOM 属性到域的映射
F 依赖
在本章中将关系模式看作 三元组 R U,D 属性-依赖

1NF 每一个分量是不可分割的数据项

定义:
数据依赖是 一个关系内部属性与属性的一种约束关系
这种关系是通过属性间的相等与否体现出来的数据间相关联系

数据依赖的类型: 函数依赖 functional dependency fd
多值依赖 multi-Valued dependency mvd

最原始的数据模式 会出现以下问题:

数据冗余

更新异常( 某系更换主任后,要修改所有学生的信息)

插入异常(某系刚成立,还没有学生 ,无法插入)

删除异常(学生全部毕业,系主任也没有了)

6.2 规范化

6.2.1 函数依赖

X->Y X确定Y

X->Y 但是Y不在X里面 叫做 非平凡的函数依赖
X-> Y 但是Y在X里面 叫做平凡的函数依赖(一般不予考虑)

x->Y X 称为 决定因素 determinant

定义:
x->Y 但是没有任何一个X的子集有 X'->Y Y 对 X 完全函数依赖 X-f->Y

如果存在相应的子集 那么 Y对X 部分函数依赖 X-p->Y
依赖存在传递性

Y 依赖X X不依赖Y
Z 依赖 Y

Z传递依赖X

6.2.2 码

码是关系模式中一个重要的概念
K-f->U K为R的候选码

如果K-p->U 那么K是超码 Surpkey

候选码是最小的超码

候选码多于一个 选定一个为主码

整个属性组是码 称为全码all-key

6.2.3 范式

schema decompositon 分解为高一级的范式
过程称为规范化 normalization

6.2.4 2nf

每一个非主属性完全依赖于一个候选码 (满足2nf)

问题的关键在于 所有非主属性必须对码 完全函数依赖

6.2.5 3nf

不存在传递依赖的关系模式

6.2.6 bcnf

每一个决定因素都包括码

一个 学生 教师 课程 S-T-J 满足 3nf 没有传递依赖 但是 T 作为决定因素 T决定J 却不是码 码是 S-T 或者S-J
一个课程对应多个老师多个学生

6.2.7 多值依赖

R(U)
XYZ 是U的子集

如果 Z= U -X-Y

并且 给定的x,z 有一个Y 并且与z的值无关 那么记为 X->->Y 多值依赖
如果z 为空 称为平凡的多值依赖

1 多值依赖是 对称的 X->->Y 那就就有 X->->Z
2 多值依赖具有传递性 X->->Y Y->->Z X->->Y-Z
3 函数依赖可以看作多值依赖的特殊情况

6.2.8 4nf

对于R中的每个非平凡多值依赖,如果X->->Y 那么X中包含码

不允许有非平凡的多值依赖

只允许平凡的多值依赖

6.2.9 规范化小结

消除非主属性对码的部分函数依赖

消除非主属性对码的传递函数依赖

消除主属性对码的 部分和传递依赖

消除非平凡(且非函数依赖)的多值依赖

6.3 数据依赖的公里系统

Armstrong
自反率
增广率
传递率

合并规则
伪传递规则
分解规则
引理6.1 X->A1A2A3... 的充分必要条件是X->Ai 成立

F所逻辑蕴含的函数依赖的全体称为 F的闭包 closure
证明暂略

6.4 模式的分解

分解具有 无损连结性

分解要保持函数依赖

算法 6.2 判断是否无损连接
每一行对应一个子关系
每一列对应一个属性
列表法

定理 6.5

对于 RUF 的一个分解 R1 U1 F1 R2 U2 F2 如果有 U1交U2 -> U1 -U2 公共属性可推出 一个中的一切

6.4.3 模式分解的几个具体的算法

算法 6.3 保持3NF函数依赖的处理 合成法
1 对于 RUF 中F 的函数依赖做极小化处理
2 找出所有不在 F 中的属性, U0 这些 U0 单独构成一个子关系 U中去掉U0
3 如果X->A 属于 F 并且 AX=U 算法停止
4 否则 将F 按照左边属性 分类 将每一组分类 都构成一个子关系 3NF 不存在对码的传递依赖和部分依赖
这里分组的时候 有可能一个组 被另外一个组 包含 ,就把被包含的组去掉即可

算法6.4 保持无损连接性 的3nf 分解

在6.3 的基础上添加一个子关系 R(XFx) 这里X是一个码

如果 原来分解的子模式中有一个 U 属于X 那么就去掉那个子模式
如果有一个 U包含 X 那就不添加这个子模式

这样就保证了 无损连结性 ( 因为保证了 其中有一个 子模式中 包含 码) 通过这个嘛 我们就可以无损连接整个关系模式了

算法 6.4 转换为 bcnf 的分解方式
分解法
对于每一个不是 bcnf 的 子模式 存在 X->A X不是码
就吧 X->A分解出去
bcnf : 所有的决定因素 都是码

算法 6.6 达到 4nf的分解
先分解到 bcnf ,然后对于每一个非平凡的多值依赖 X->->Y 进行分解 X,Y X,Z Z=U-X-Y

关系数据库理论 ch.6的更多相关文章

  1. Data Management Technology(4) -- 关系数据库理论

    规范化问题的提出 在规范化理论出现以前,层次和网状数据库的设计只是遵循其模型本身固有的原则,而无具体的理论依据可言,因而带有盲目性,可能在以后的运行和使用中发生许多预想不到的问题. 在关系数据库系统中 ...

  2. 关系数据库(ch.2)

    2.1.1 关系 域 笛卡儿积 关系 candiate key 如果一组属性值可以唯一的标识一个元祖,但是他的子集不行,那么这是一个候选码 关系可以由三种类型 基本关系 查询关系 视图 为关系附加如下 ...

  3. 转!!数据库 第一范式(1NF) 第二范式(2NF) 第三范式(3NF)的 联系和区别

    范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中 ...

  4. 浅析Oracle范式的概念(转载)

    范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中 ...

  5. T-SQL动态查询(3)——静态SQL

    接上文:T-SQL动态查询(2)--关键字查询   本文讲述关于静态SQL的一些知识和基础技巧. 简介: 什么是静态SQL?静态SQL是和动态SQL相对而言的,其实我们没必要过于纠结精确定义,只要大概 ...

  6. T-SQL动态查询(1)——简介

    起因: 由于最近工作需要及过去一直的疑问,所以决定着手研究一下动态SQL.由于离开一线开发有点年头了,很多技巧性的东西没有过多研究,作为DBA和<SQL Server性能优化与管理的艺术> ...

  7. 如何成为一个优秀的DBA

    今天在群上跟技术友们聊天.发现有几个大学生,他们很担心自己找不到工作.我问他们理由,他们说我们没有经验,公司不要怎么办?这些孩子们的担心,让我感觉到奇怪. 如果我是一个公司的老总,我会有这两种考虑:要 ...

  8. 理解ORM的前提:数据库中的范式和约束

    理解ORM的前提:数据库中的范式和约束 一.数据库中的范式: 范式, 英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出 ...

  9. Microsoft Office Access

    Microsoft Office Access各版本下载地址:http://www.accessoft.com/download.html 简介 access(微软发布的关联式数据库管理系统)一般指M ...

随机推荐

  1. React项目开发经验汇总

    博客来源 小寒的博客   定义好全局配置信息 环境变量不要提取出来,配置信息提取出来 UI样式变量 定义好变量的作用不用多说 样式库建设 工具样式,复用性强的样式,这些class成为会是真个网站样式的 ...

  2. 为什么Java中的String是设计成不可变的?(Why String is immutable in java)

    There are many reasons due to the string class has been made immutable in Java. These reasons in vie ...

  3. eclipse快捷大全

    Eclipse常用快捷键 1几个最重要的快捷键 代码助手:Ctrl+Space(简体中文操作系统是Alt+/)快速修正:Ctrl+1单词补全:Alt+/打开外部Java文档:Shift+F2 显示搜索 ...

  4. ssh 与服务器保持连接

    直接改客户端,服务器端不应该更改. sudo vi /etc/ssh/ssh_config # 或 ~/.ssh/config TCPKeepAlive=yes # Client每隔 60 秒发送一次 ...

  5. Spring MVC(十三)--保存并获取属性参数

    这里的属性参数主要是指通过request.session.cookie等设置的属性,有时候我们需要将一些请求的参数保存到HTTP的request或者session对象中去,在控制器中也会进行设置和获取 ...

  6. vue中使用watch函数,当数据改变时自动引发事件

    本来我的需求是这样的,使用ElementUI的日期选择器,当日期选择器被更改时需要根据新日期来向服务器获取新数据,但是发现这个日期选择器没有change事件,后来终于发现vue有个watch函数就是用 ...

  7. python学习笔记4.2_正则表达式

    常用正则表达式:http://tool.chinaz.com/regex/ 1.正则表达式:提供了一种在文本中灵活查找或匹配字符串模式的方法.单个表达式通常被称为regex. 2.python的re模 ...

  8. STL与泛型编程第一周作业

    /* 题目: 给定一个 vector:v1 = [0, 0, 30, 20, 0, 0, 0, 0, 10, 0],希望通过not_equal_to 算法找到到不为零的元素,并复制到另一个 vecto ...

  9. 2019-10-31-C#-dotnet-获取整个局域网的-ip-地址

    title author date CreateTime categories C# dotnet 获取整个局域网的 ip 地址 lindexi 2019-10-31 08:57:55 +0800 2 ...

  10. js的相关距离

    js的相关距离 一.dom对象的距离 ---dom.style.width : 对象本身的内容宽度(这里必须是内联样式中的width,带px)(content) ---dom.style.height ...