数据库系统原理笔记:关系数据库设计
文章目录
- 一:一个好的关系设计应该是怎样的?
- 1、从一个大表开始讲起
- 2、表的分解
- 1)函数依赖
- 2)有损分解
- 3)函数依赖角度判断无损连接分解
- 二、第一范式
- 三、BCNF范式
- 1、BCNF定义:
- 2、BCNF分解
- 3、依赖保持
- 4、BCNF不能保证依赖保持
- 四、第三范式
- 定义:
- 五、标准化的目标
- 六、基于函数依赖的范式的缺陷
- 七、正则覆盖
- 1、无关属性
- 2、检测无关属性
- 3、正则覆盖
- 1) 求解正则覆盖的流程:
- 2) 求解实例
- 八、保持依赖
- 1、函数依赖集的限定
- 2、保持依赖的判定
- 九、分解算法
- 1、BCNF分解算法
- - 如何判定RiR_iRi不满足BCNF?:
- 2、3NF
一:一个好的关系设计应该是怎样的?
1、从一个大表开始讲起
假设我们将两个表instructor和department通过自然连接结合起来,效果如图:
这个新表的问题有很多:
冗余问题:每个系的信息实际上是确定的,该表却把dept_name,building,budget一遍一遍地输入
一致性问题:dept_name和building应该是一一对应的,那么假如有一条修改了其中的一个信息。比如Physics对应的Building是Taylor,就导致了信息不一致。
插入数据时产生错误:假如我们想创立一个新系,除非系里至少有一名老师,否则我们无法创立这个系(因为主键是老师的ID)。
2、表的分解
首先,表也不是越小越好。数据库中可能有大量(上百万或者元组),利用小表进行探查成本就会很高。
1)函数依赖
分解需要用到函数依赖。
函数依赖的使用规则是:
如果存在模式(dept_name,budget),其中dept_name可以作主码,则
dept_name →\rightarrow→ budget
平凡依赖:
函数依赖的闭包:
对于一个表上的函数依赖作以下处理:
若F中存在 A→B并且 B→C
可以自然导出 A→C
那么F+F^+F+包含了{ A→B,B→C, A→C}
不断重复以上处理,直到不能继续自然导出函数依赖之后,就得到了依赖闭包
属性闭包:
(α)+{(\alpha)}^+(α)+指的是由α{\alpha}α所决定的全部属性的集合
2)有损分解
有损分解:分解之后再进行自然连接会导致信息丢失
一个好的关系模式应该是这样的:
把一个关系R分解为若干个小关系的集合{R1,R2,…}
- 这些关系符合“好的关系模式”
- 该分解是无损分解
3)函数依赖角度判断无损连接分解
假设R分解为{R1,R2R_1,R_2R1,R2}
如果以下两种依赖至少有一个成立,则连接是无损的。
- R1∩R2→R1R_1\cap R_2\to R_1R1∩R2→R1
- R1∩R2→R2R_1\cap R_2\to R_2R1∩R2→R2
也就是说 R1∩R2R_1\cap R_2R1∩R2是 R1或R2R_1或 R_2R1或R2的超码,该分解就是无损分解。
二、第一范式
如果R中所有属性的域都是原子的,那么我们称R为第一范式
比如有一条信息 CS-100,CS表示计算机系,100表示课程序号。也就是“计算机系的100号课程”
但如果想提取出来这些信息,数据库是办不到的,需要应用程序才能办到。
第一范式的实质:消除复合属性
三、BCNF范式
1、BCNF定义:
对于所有F+F^+F+中的函数依赖
α→β\alpha \rightarrow\betaα→β满足以下两点之一:
- α→β\alpha \rightarrow\betaα→β是平凡的
- α\alphaα是R的超键
2、BCNF分解
很显然,如果依赖α→β\alpha \rightarrow\betaα→β满足下面两点:
- α→β\alpha \rightarrow\betaα→β不是平凡的
- α\alphaα不是R的超键
那么,α和β\alpha 和\betaα和β可以单独列成一个表。
可以用以下两个表:
3、依赖保持
约束(包括函数依赖)检查起来开销很大。除非约束只属于一个关系。
而依赖保持的含义是:
将一个关系分解为多个子关系后
若所有子关系满足各自的函数依赖保持,那么原关系所有的函数依赖都能保持,这样的分解就是依赖保持的分解
4、BCNF不能保证依赖保持
假设有这样的关系:
该关系上存在两个依赖:
按照BCNF,应分解成这样两个表:
此时,s_ID,dept_name →\rightarrow→ i_ID已经不再被保持了。
为了保持依赖,我们使用另一种范式:第三范式
四、第三范式
定义:
对于所有F+F^+F+中的函数依赖
α→β\alpha \rightarrow\betaα→β满足以下两点之一:
- α→β\alpha \rightarrow\betaα→β是平凡的
- α\alphaα是R的超键
- β−α\beta-\alphaβ−α中的每一个属性A都是R的某个候选键的一部分(可以是不同的候选键)。
五、标准化的目标
对于一张表R,假如它不满足一个“好”的形式,就把它分解为多个子表{R1, R2, …, Rn} 。分解应满足以下条件:
- 分解必须是无损(lossless)的
- 最好还能保持依赖
六、基于函数依赖的范式的缺陷
假设有两张表,
child_name(ID,child_name)
ID | child_name |
---|---|
99999 | David |
99999 | William |
phone_number(ID,phone_number)
ID | phone_number |
---|---|
99999 | 512-555-1234 |
99999 | 512-555-4321 |
合并两张表,我们得到
这张表仅存在平凡依赖,因此满足BCNF
但是存在过多的冗余。
更重要的是,插入时会产生错误:比如插入一条
{ID:phone , phone_number:981-992-3443}
我们需要同时在表中插入两条数据
(99999, David, 981-992-3443)
(99999, William, 981-992-3443)
才可以。
基于函数依赖理论的范式均有这个问题
七、正则覆盖
1、无关属性
如果去除函数依赖中的一个属性不改变该函数依赖集的闭包,则称该属性是无关的。
考虑F中的函数依赖α→β\alpha \rightarrow\betaα→β
注意表述: A在α\alphaα中是无关的。并不是说A在整个函数依赖集中是无关的。
2、检测无关属性
3、正则覆盖
F的正则覆盖集FcF_cFc是一个依赖集,
- F逻辑蕴含FcF_cFc中所有的依赖
- FcF_cFc逻辑蕴含F中所有的依赖。
- FcF_cFc中任何函数依赖都不含无关属性
- FcF_cFc中函数依赖的左半部是唯一的。即不存在两个依赖α1→β1{\alpha}_1 \rightarrow{\beta}_1α1→β1和α2→β2{\alpha}_2 \rightarrow{\beta}_2α2→β2,满足α1=α2{\alpha}_1={\alpha}_2α1=α2
1) 求解正则覆盖的流程:
强调的是,在检验无关属性时,使用的是FcF_cFc而非F
2) 求解实例
求解的正则覆盖未必是唯一的
在A→BCA\to BCA→BC中,B和C都是无关的。(去掉B,FcF_cFc可以导出A→CA\to CA→C,C同理),但是不能把两个同时去掉,必须要保存1个。
这样会得出不同的正则覆盖。
八、保持依赖
1、函数依赖集的限定
首先引入一个概念:限定(restriction)
F在RiR_iRi上的限定是F+F^+F+中所有只包含RiR_iRi中属性的函数依赖的集合FiF_iFi
注意,限定是在F+F^+F+上求得的
2、保持依赖的判定
R分解为{R1,R2...RnR_1,R_2...R_nR1,R2...Rn},
并且对应着限定{F1,F2...FnF_1,F_2...F_nF1,F2...Fn}
F′=F1∪F2∪F3...∪FnF' = F_1\cup F_2\cup F_3...\cup F_nF′=F1∪F2∪F3...∪Fn
- ①若F′+=F+{F'}^+=F^+F′+=F+,则该分解是保持依赖的分解。
- ②若F′+≠F+{F'}^+≠F^+F′+=F+,还需要进一步判定。判定按以下步骤:
对于F中的每一个α→β\alpha \to \betaα→β
算法解释:
t = (result∩Ri)+∪Ri{(result \cap R_i)}^+\cup R_i(result∩Ri)+∪Ri实际上是在求result在FiF_iFi上的属性闭包。
求出的最终结果是α\alphaα在F’上的属性闭包
如果最终result中包含β\betaβ,那么α→β\alpha \to \betaα→β就是成立的。
九、分解算法
1、BCNF分解算法
注:必须保证α∩β=∅\alpha \cap \beta=\emptyα∩β=∅,因为α∩β\alpha \cap \betaα∩β这部分属性不会在结果集中出现
- 如何判定RiR_iRi不满足BCNF?:
对于简单的情况,判定RRR是否满足BCNF
对于α→β\alpha\to\betaα→β,求出α+{\alpha}^+α+并判断:
β⊂α\beta \subset \alphaβ⊂α?(是否是平凡依赖)
Ri⊂α+{R_i \subset \alpha}^+Ri⊂α+?(是否是主键)?
该方法求属性闭包时,使用的是R上的依赖F
但是,把R分解为RiR_iRi后,求α+{\alpha}^+α+时,使用的应该是R上的依赖闭包F+F^+F+(而不是F)原因如下:
求F+F^+F+是很困难的。所以考虑更简单的方法:
下面是一种方法:
2、3NF
未完待续
数据库系统原理笔记:关系数据库设计相关推荐
- 【数据库系统原理】数据库设计
数据库设计 文章目录 数据库设计 一.数据库设计概述 1.数据库设计的步骤 2.数据库设计概念 3.数据库设计的目标 4.数据库设计的特点 5.可行性分析 二.需求分析 1.需求分析阶段的任务 2.需 ...
- 【mysql】期末数据库复习指南(《数据库系统概率》知识点总结,数据库系统原理,数据库设计课程复习)
数据库试卷题型: 选择题 20*2 =40 填空题 10*1 =10 简答题 3*4 =12SQL 30分+ 插入 2 建视图 2 单表查询条件 2 平均成绩avg 2 多表查询 4 触发器 存储函数 ...
- 数据库系统原理(BNU_党德鹏_慕课)超详细听课笔记
数据库系统原理 笔记 第一章 绪论 第一节 数据库 第二节 数据库管理系统 第三节 数据管理技术发展趋势 第二章 关系模型 第一节 关系结构和约束 第二节 基本关系代数运算 第三节 附加关系代数运算 ...
- 数据库系统原理 - - (1)数据库系统概论
感谢内容提供者:金牛区吴迪软件开发工作室 文章目录 一:数据库系统概论 1.数据库基本概念 a.什么是数据? b.什么是数据库? c.数据库中存储的数据的三个基本特点 d.数据库管理系统及其功能 e. ...
- 设计全局ER模型 数据库系统原理(2007版) 课程代码4735 笔记
设计全局ER模型 根题目:采用ER模型的数据库概念设计步骤 摘自:数据库系统原理(2007版) 课程代码4735 P46页 1. 设计局部 ER 模型* 确定局部结构范围* 定义实体* 定义联系* 分 ...
- 数据库系统原理设计--论坛系统
论坛信息管理系统 摘要:随着科学技术的发展,基本上所有的具有一定数量数据的机构都 开始使用计算机数据库来管理.现如今网络盛行,BBS 论坛已成为人们生活 中的一种信息交流渠道,它通过在计算机上运 ...
- 《数据库系统原理与设计》万常选著知识点整理
数据库系统原理与设计 1.1数据库系统 数据管理技术经历了人工管理.文件系统和数据库管理系统3个阶段. 1.人工管理的数据是面向应用程序的. 2.文件系统阶段已经有了操作系统,有专门的软件对数据进行统 ...
- 数据库系统原理(第三章数据库设计 )
一.数据库设计概述 数据库的生命周期 数据库设计的目标: 满足应用功能需求(存.取.删.改), 良好的数 据库性能(数据的高效率存取和空间的节省 共享性.完整性.一致性.安全保密性) 数据库设计的内 ...
- 【数据库原理及应用】经典题库附答案(14章全)——第六章:关系数据库设计过程
[数据库原理及应用]经典题库附答案(14章全)--第一章:数据库基础知识 [数据库原理及应用]经典题库附答案(14章全)--第二章:关系数据库知识 [数据库原理及应用]经典题库附答案(14章全)--第 ...
最新文章
- idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
- Android之在BaseAdapter源码中了解观察者模式
- lisp直线连接圆象限电_用小学数学知识解释,为什么井盖是圆的?
- 一些有意思的VR设备介绍
- LeetCode Perfect Squares
- [转载]ArcMap中如何自制符号库(二)
- javascript Navigator对象属性和方法
- 合约实战,代币合约,DAPP开发
- 重磅!2020中国高校毕业生月薪排名:清华第1,24高校过万,你呢?
- 你写的代码扩展性高吗?快试试用Spring注入方式来解耦代码!
- 果然天蝎座的人积分落户最容易...
- 区块链、密码和银行之间的衍生关系
- uniapp通讯录等敏感权限检查、申请。获取通话记录等内容
- Unity工程里的那些东西
- Openstack集群-Ceph集群作为存储的部署
- 人体的神经系统图 分布,神经系统分布图解析图
- 利用java查看本机的cpu、内存情况
- 浅谈我对元宇宙、Web3、区块链与NFT的理解
- Ubuntu18.04 通过命令修改ip地址(亲测有效)
- Python绘制地磁场
热门文章
- android studio 布局设计,Andriod界面设计适配和Android Studio中的资源
- 怎么删除w7桌面计算机图标,w7桌面图标箭头怎么去掉?w7桌面图标箭头去掉方法...
- 什么是Git?——Git的学习与使用(一)
- linux无网络环境pcre安装,Linux下无网络安装Nginx
- 什么是php 的精华,PHP精华
- linux通用自启动管理,linux下通过xinetd服务管理 rsync 实现开机自启动
- VoltDB培训PPT一则
- python更新织梦网站_怎么让dedecms织梦网站首页自动更新
- android开发框架_2019 年五大跨平台移动应用开发工具
- RSAES-OAEP 和 RSAES-PKCS1-v1_5 和 RSASSA-PSS 和 RSASSA-PKCS1-v1_5