文章目录

  • 一:一个好的关系设计应该是怎样的?
    • 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. 【数据库系统原理】数据库设计

    数据库设计 文章目录 数据库设计 一.数据库设计概述 1.数据库设计的步骤 2.数据库设计概念 3.数据库设计的目标 4.数据库设计的特点 5.可行性分析 二.需求分析 1.需求分析阶段的任务 2.需 ...

  2. 【mysql】期末数据库复习指南(《数据库系统概率》知识点总结,数据库系统原理,数据库设计课程复习)

    数据库试卷题型: 选择题 20*2 =40 填空题 10*1 =10 简答题 3*4 =12SQL 30分+ 插入 2 建视图 2 单表查询条件 2 平均成绩avg 2 多表查询 4 触发器 存储函数 ...

  3. 数据库系统原理(BNU_党德鹏_慕课)超详细听课笔记

    数据库系统原理 笔记 第一章 绪论 第一节 数据库 第二节 数据库管理系统 第三节 数据管理技术发展趋势 第二章 关系模型 第一节 关系结构和约束 第二节 基本关系代数运算 第三节 附加关系代数运算 ...

  4. 数据库系统原理 - - (1)数据库系统概论

    感谢内容提供者:金牛区吴迪软件开发工作室 文章目录 一:数据库系统概论 1.数据库基本概念 a.什么是数据? b.什么是数据库? c.数据库中存储的数据的三个基本特点 d.数据库管理系统及其功能 e. ...

  5. 设计全局ER模型 数据库系统原理(2007版) 课程代码4735 笔记

    设计全局ER模型 根题目:采用ER模型的数据库概念设计步骤 摘自:数据库系统原理(2007版) 课程代码4735 P46页 1. 设计局部 ER 模型* 确定局部结构范围* 定义实体* 定义联系* 分 ...

  6. 数据库系统原理设计--论坛系统

    论坛信息管理系统  摘要:随着科学技术的发展,基本上所有的具有一定数量数据的机构都  开始使用计算机数据库来管理.现如今网络盛行,BBS 论坛已成为人们生活  中的一种信息交流渠道,它通过在计算机上运 ...

  7. 《数据库系统原理与设计》万常选著知识点整理

    数据库系统原理与设计 1.1数据库系统 数据管理技术经历了人工管理.文件系统和数据库管理系统3个阶段. 1.人工管理的数据是面向应用程序的. 2.文件系统阶段已经有了操作系统,有专门的软件对数据进行统 ...

  8. 数据库系统原理(第三章数据库设计 )

    一.数据库设计概述 数据库的生命周期  数据库设计的目标: 满足应用功能需求(存.取.删.改), 良好的数 据库性能(数据的高效率存取和空间的节省 共享性.完整性.一致性.安全保密性) 数据库设计的内 ...

  9. 【数据库原理及应用】经典题库附答案(14章全)——第六章:关系数据库设计过程

    [数据库原理及应用]经典题库附答案(14章全)--第一章:数据库基础知识 [数据库原理及应用]经典题库附答案(14章全)--第二章:关系数据库知识 [数据库原理及应用]经典题库附答案(14章全)--第 ...

最新文章

  1. idea本地跑如何看gc日志_不可思议,竟然还有人不会查看GC垃圾回收日志?
  2. Android之在BaseAdapter源码中了解观察者模式
  3. lisp直线连接圆象限电_用小学数学知识解释,为什么井盖是圆的?
  4. 一些有意思的VR设备介绍
  5. LeetCode Perfect Squares
  6. [转载]ArcMap中如何自制符号库(二)
  7. javascript Navigator对象属性和方法
  8. 合约实战,代币合约,DAPP开发
  9. 重磅!2020中国高校毕业生月薪排名:清华第1,24高校过万,你呢?
  10. 你写的代码扩展性高吗?快试试用Spring注入方式来解耦代码!
  11. 果然天蝎座的人积分落户最容易...
  12. 区块链、密码和银行之间的衍生关系
  13. uniapp通讯录等敏感权限检查、申请。获取通话记录等内容
  14. Unity工程里的那些东西
  15. Openstack集群-Ceph集群作为存储的部署
  16. 人体的神经系统图 分布,神经系统分布图解析图
  17. 利用java查看本机的cpu、内存情况
  18. 浅谈我对元宇宙、Web3、区块链与NFT的理解
  19. Ubuntu18.04 通过命令修改ip地址(亲测有效)
  20. Python绘制地磁场

热门文章

  1. android studio 布局设计,Andriod界面设计适配和Android Studio中的资源
  2. 怎么删除w7桌面计算机图标,w7桌面图标箭头怎么去掉?w7桌面图标箭头去掉方法...
  3. 什么是Git?——Git的学习与使用(一)
  4. linux无网络环境pcre安装,Linux下无网络安装Nginx
  5. 什么是php 的精华,PHP精华
  6. linux通用自启动管理,linux下通过xinetd服务管理 rsync 实现开机自启动
  7. VoltDB培训PPT一则
  8. python更新织梦网站_怎么让dedecms织梦网站首页自动更新
  9. android开发框架_2019 年五大跨平台移动应用开发工具
  10. RSAES-OAEP 和 RSAES-PKCS1-v1_5 和 RSASSA-PSS 和 RSASSA-PKCS1-v1_5