notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 问题的提出
  • 规范化
  • 函数依赖
  • 码
  • 范式
  • 2NF
  • 3NF
  • BCNF
  • 多值依赖
  • 4NF
  • 规范化小结
  1. blogs
  2. history

关系数据理论

Previous关系数据库标准语言SQL(二)Next关系查询处理和查询优化

Last updated 3 years ago

问题的提出

针对一个具体问题,应该如何构造一个适合于它的数据库模式,即应该构造几个关系模式,每个关系由哪些属性组成等。这是数据库设计的问题,确切地讲是关系数据库逻辑设计问题。

由于关系模型有严格的数学理论基础,并且可以向别的数据模型转换,因此,人们就以关系模型为背景来讨论这个问题,形成了数据库逻辑设计的一个有力工具——关系数据库的规范化理论。

关系模式由五部分组成,即它是一个五元组:R(U, D, DOM, F)

  • R:关系名

  • U:组成该关系的属性名集合

  • D:属性组U中属性所来自的域

  • DOM:属性向域的映象集合

  • F:属性间数据的依赖关系集合

由于D、DOM与模式设计关系不大,关系模式R(U, D, DOM, F)简化为一个三元组:

R(U,F)R(U,F)R(U,F) 当且仅当U上的一个关系r满足F时,r称为关系模式 R(U, F)的一个关系。 作为二维表,关系要符合一个最基本的条件:每个分量必须是不可分开的数据项。满足了这个条件的关系模式就属于第一范式(1NF)

数据依赖

  • 是一个关系内部属性与属性之间的一种约束关系

  • 通过属性间值的相等与否体现出来的数据间相互联系

  • 是现实世界属性间相互联系的抽象

  • 是数据内在的性质

  • 是语义的体现

数据依赖的主要类型

  • 函数依赖(Functional Dependency,简记为FD)

  • 多值依赖(Multi-Valued Dependency,简记为MVD)

规范化

函数依赖

定义:设R(U)是一个属性集U上的关系模式,X和Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等, 而在Y上的属性值不等, 则称X函数确定Y或Y函数依赖于X,记作$X \rightarrow Y$。 注意:函数依赖不是指关系模式R的某个或某些关系满足的约束条件,而是值R的一切关系均要满足的约束条件。

平凡函数依赖与非平凡函数依赖 在关系模式R(U)中,对于U的子集X和Y,

  • 如果X→Y,但$Y\nsubseteq X$,则称X→Y是非平凡的函数依赖

  • 如果X→Y,但$Y\subseteq X$,则称X→Y是平凡的函数依赖 对于任一关系模式,平凡函数依赖都是必然成立的,它不反映新的语义。

  • 若X→Y,则X称为这个函数依赖的决定属性组,也称为决定因素(determinant)。

  • 若X→Y,Y→X,则记作$X\leftarrow\rightarrow Y$。

  • 若Y不函数依赖于X,则记作$X\nrightarrow Y$。

完全函数依赖和部分函数依赖 定义:在R(U)中,

码

定义:设K为R<U,F>中的属性或属性组合。若$K\overset{F}{\rightarrow} U$,则K称为R的侯选码(Candidate Key)。

如果U部分函数依赖于K,即$K\overset{P}{\rightarrow} U$,则K称为超码(Surpkey)。候选码是最小的超码,即K的任意一个真子集都不是候选码。若候选码多于一个,则选定其中的一个为主码(primary key)。

包含在任何一个候选码中的属性称为主属性;不包含在任何候选码的属性称为非主属性或非码属性。最简单的情况,单个属性是码;最极端的情况,整个属性组是码,称为全码。

定义:关系模式R中属性或属性组X并非R的码,但X是另一个关系模式的码,则称X是R的外部码(Foreign key),也称外码。

范式

  • 范式(Normal Form)是符合某一种级别的关系模式的集合.

  • 关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式

  • 范式的种类:

    • 第一范式(1NF)

    • 第二范式(2NF)

    • 第三范式(3NF)

    • BC范式(BCNF)

    • 第四范式(4NF)

    • 第五范式(5NF)

  • 一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化(Normalization)。

2NF

定义:若$R\in 1NF$,且每一个非主属性完全函数依赖于任何一个候选码,则$R\in 2NF$。

一个关系模式不属于2NF,会产生以下问题:

  • 插入异常

  • 删除异常

  • 修改复杂

3NF

定义:设关系模式$R\langle U,F\rangle\in1NF$,若R中不存在这样的码X、属性组Y及非主属性Z($Z\nsupseteq Y$),使得X→Y ,Y→X,Y→Z成立,$Y\nrightarrow X$,则称$R\langle U,F \rangle \in 3NF$。

由定义可以证明,若$R\in 3NF$,则每一个非主属性既不传递依赖于码,也不部分依赖于码。也就是说,可以证明如果R属于3NF,则必有R属于2NF。

一个关系模式不属于3NF,会产生以下问题:

  • 插入异常

  • 删除异常

  • 修改复杂

BCNF

定义:关系模式$R\langle U,F \rangle\in 1NF$,若X→Y且$Y\nsubseteq X$时X必含有码,则$R\langle U,F \rangle \in BCNF$。 也就是说,关系模式R<U,F>中,若每一个决定因素都包含码,则$R\langle U,F \rangle \in BCNF$。

若$R\in BCNF$

  • 所有非主属性对每一个码都是完全函数依赖

  • 所有的主属性对每一个不包含它的码,也是完全函数依赖

  • 没有任何属性完全函数依赖于非码的任何一组属性

如果一个关系数据库中的所有关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了模式的彻底分解,达到了最高的规范化程度,消除了插入异常和删除异常。

多值依赖

定义:设R(U)是一个属性集U上的一个关系模式,X、Y和Z是U的子集,并且Z=U-X-Y。关系模式R(U)中多值依赖 X→→Y成立,当且仅当对R(U)的任一关系r,给定的一对(x,z)值,有一组Y的值,这组值仅仅决定于x值而与z值无关。

平凡多值依赖和非平凡的多值依赖

  • 若X→→Y,而Z=Ф,则称X→→Y为平凡的多值依赖

  • 否则称X→→Y为非平凡的多值依赖

多值依赖的性质

  • 多值依赖具有对称性 若X→→Y,则X→→Z,其中Z=U-X-Y

  • 多值依赖具有传递性。 即若X→→Y,Y→→Z, 则 X→→Z -Y。

  • 函数依赖是多值依赖的特殊情况。 若X→Y,则X→→Y。

  • 若X→→Y,X→→Z,则X→→YZ。

  • 若X→→Y,X→→Z,则X→→Y∩Z。

  • 若X→→Y,X→→Z,则X→→Y-Z,X→→Z -Y。

多值依赖与函数依赖的区别

  • 多值依赖的有效性与属性集的范围有关

  • 若函数依赖X→Y在R(U)上成立,则对于任何$Y'\subset Y$均有X→Y’成立。多值依赖X→→Y若在R(U)上成立,不能断言对于任何$Y'\subset Y$有X→→Y'成立。

4NF

定义:关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y($Y\nsubseteq X$),X都含有码,则R∈4NF(4NF就是限制关系模式的属性之间不允许有非平凡且非函数依赖的多值依赖)。

4NF所允许的非平凡的多值依赖实际上是函数依赖。 显然,如果一个关系模式是4NF,则必为BCNF。

规范化小结

  • 关系数据库的规范化理论是数据库逻辑设计的工具

  • 目的:尽量消除插入、删除和修改异常,数据冗余

  • 基本思想:逐步消除数据依赖中不合适的部分 实质:概念的单一化

《数据库系统概论(第5版)》王珊 萨师煊 著

如果X→Y,并且对于X的任何一个真子集X’,都有${X'}\nrightarrow Y$, 则称Y对X完全函数依赖,记作 X→FYX \overset{F}{\rightarrow} YX→FY

如果X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作 X→PYX \overset{P}{\rightarrow} YX→PY

传递函数依赖 定义:在R(U)中,如果X→Y($Y\nsubseteq X$),$Y\nrightarrow X$,Y→Z,$Z\nsubseteq Y$,则称Z对X传递函数依赖。记为: X→传递ZX\overset{传递}{\rightarrow} ZX→传递Z 注: 如果Y→X, 即X←→Y,则Z直接依赖于X。

各种范式之间存在联系: 5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF5NF\subset 4NF\subset BCNF\subset 3NF\subset 2NF\subset 1NF5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF 某一关系模式R为第n范式,可简记为R∈nNF。

关系模式规范化的基本步骤

关系数据理论1