• 《数据库系统概论》第六章笔记


    第六章 关系数据理论

    本章主要针对如何构造一个好的数据库模式这一问题,介绍了关系规范化理论,介绍了几种数据库设计的范式。

    这里这记录了前两节,本章后两节,太数学化,瞄了下,就不做笔记了。

    6.1 问题的提出

    针对一个具体问题,应该如何构造一个合适的数据库模式。

    一个不合适的关系模式,可能会存在以下几个问题:

    • 数据冗余

      • 重复数据太多
    • 更新异常

      • 由于数据冗余,更新数据时,系统需要付出很大的代价来维护数据库的完整性,否则会面临数不一致的危险。
    • 插入异常

      • 由于关系模式设计不合理,导致部分不依赖主键的信息,因为没有主键而无法插入(只是以依赖主键作为例子,后面范式会讲到其他依赖)
    • 删除异常

      • 和插入异常类似,同一元组中,部分信息不依赖主键,在删除的时候,本应保留,却因不能没有主键而被连带删除了

    6.2 规范化

    规范化讨论的是如何该找一个不好的模式。

    一个低一级范式的关系模式通过模式分解,可以转换为若干高一级范式的关系模式的集合,这种过程称为规范化

    通常按属性间依赖情况来区分关系规范化程度位第一范式、第二范式、第三范式和第四范式等。

    6.2.1 函数依赖

    定义:

    设R(U)是属性集U上的关系模式,X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性不等,则称X函数确定Y或Y函数依赖于X,记作X —>Y。

    就一句话,关系模式上的任意关系,只要元组的X相等,则该元组的Y必定相等,则称Y函数依赖于X。

    下面介绍有关函数依赖的几个定义:

    • X—>Y,但是Y包含于X,这种称为平凡的函数依赖。对任意关系模式,平凡的函数依赖都必然成立
    • 若X—>Y,则称X为决定属性组,则称为决定因素
    • X—>Y,如果对于X的任何一个真子集X‘,都没有X’ —> Y,则称Y对X完全函数依赖
    • X—>Y,但Y不完全依赖于X,则称Y对X部分函数依赖
    • X—>Y是非平凡的函数依赖,且不存在Y—>X,如果Y—>Z是非平凡的函数依赖,则Z对X传递函数依赖。如果存在Y—>X,则为直接函数依赖。

    6.2.2 第一范式(1NF)

    定义:

    关系中的每一个分量,必须是不可分的数据项。满足这个条件的关系模式就属于第一范式

    6.2.3 第二范式(2NF)

    定义:

    如果R属于1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R属于第二范式

    6.2.4 第三范式(3NF)

    定义:

    如果R属于1NF,若R中不存在这样的码X,属性组Y及非主属性Z (Z不包含于Y) ,使得X—>Y,Y—>Z成立,Y不函数依赖于X,则称R属于第三范式

    即,如果关系模式R属于3NF,则每个非主属性既不传递依赖于码,也不部分依赖于码

    如果R属于3NF,则必有R属于2NF。

    6.2.5 BCNF

    BCNF是由Boyce和Codd提出,比3NF又进一步,通常认为是修正的第三范式,或者扩充的第三范式。

    定义:

    关系模式R属于1NF,若Y非平凡依赖于X时,X必含有码,则R属于BCNF

    也就是说每个决定因素中必含有码,则R属于BCNF。

    一个满足BCNF的关系模式有:

    • 所有的非主属性对每一个码都是完全函数依赖。
    • 所有主属性对每一个不包含它的码也是完全函数依赖。
    • 没有任何属性完全函数依赖于非码的任何一组属性。

    如果R属于BCNF,由于BCNF排除了任何属性对码的传递依赖和部分依赖,则R必定属于3NF。

    6.2.6 多值依赖

    定义:

    设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为平凡的多值依赖。对于R(X,Y),如果X—>—>Y成立,则为平凡的多值依赖。

    多值依赖的性质:

    • 多值依赖具有对称性。
      • 若X—>—>Y,则X—>—>Z,其中Z = U-X-Y
    • 多值依赖具有传递性。
      • 若X—>—>Y,Y—>—>Z,则X—>—>Z-Y。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

    多值依赖与函数依赖的两个基本区别:

    • 多值依赖的有效性与属性集的范围有关。
      • 多值依赖在属性集U上成立,则一定在U的子集W(XY包含于W)上成立。反之在W上成立,则不一定在U成立。因为定义中还涉及U中的其余属性Z。
    • 函数依赖X—>Y,则Y的真子集也一定函数依赖于X;而多值依赖没有这样的性质,因为定义中还涉及U中的其余属性Z。

    我总结两个区别:

    • 一是定义中还涉及U中的其余属性Z
    • 二是Y的个数不限制为一个了

    6.2.7 第四范式(4NF)

    定义:

    关系模式R属于1NF,如果对于R的每一个非平凡的多值依赖X—>—>Y,X都含有码,则称R属于第四范式

    也就是限制关系模式的属性之间不允许有非平凡的且非函数依赖的多值依赖。因为对于非平凡的多值依赖X—>—>Y,X含有候选码,则有X—>Y。即4NF所允许的非平凡的多值依赖就是函数依赖

    6.2.8 规范化小结

    规范化的基本思想就是逐步消除数据依赖中不合适的部分。

    各范式作用:

    • 第一范式规定了数据项的不可分割性。
    • 第二范式消除了非主属性对码的部分函数依赖
    • 第三范式消除了非主属性对码的传递函数依赖
    • BCNF消除了主属性对码的部分和传递函数依赖
    • 第四范式消除了非平凡且非函数依赖的多值依赖
  • 相关阅读:
    整理打印PI值
    使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
    ThinkPHP+jQuery EasyUI Datagrid查询数据的简单处理
    ThinkPHP学习(三)
    Apache+PHP配置PATHINFO的一个小问题
    ThinkPHP学习(二)
    接口签名工具类
    RSA加密和解密工具类
    kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)
    自己实现字符串转整数(不使用JDK的字符串转整数的方法)
  • 原文地址:https://www.cnblogs.com/wchaos/p/9711804.html
Copyright © 2020-2023  润新知