视频来自https://www.bilibili.com/video/BV1Bq4y1Y7GC

关系理论

函数依赖

函数依赖指的是X可以推导出Y,即Y依赖于X,记作X->Y

  • 非平凡的函数依赖:XY,Y⊄X{X}\rightarrow{Y},{Y}\not\subset{X},在大多数情况下没有指明的函数依赖都是非平凡的函数依赖
  • 平凡的函数依赖:XY,YX{X}\rightarrow{Y},{Y}\in{X},几乎没有什么作用,一般某个集合总能推导出其子集,即平凡的函数依赖
  • 完全函数依赖:XYX\rightarrow{Y},并且对于X的任意真子集X',都有Y不依赖于X',则称之为完全函数依赖;
    个人理解就是,当Y依赖于X时,仅有X本身可以推导出Y,X的任意部分都不能单独推导出Y
  • 部分函数依赖:Y不完全函数依赖于X。即作X-P->Y(P在箭头上)。例如ACA\rightarrow{C},又有ABC{AB}\rightarrow{C},那么C就是部分依赖于AB。
    这种情况会导致数据冗余,因为A本身就可以推导出C,B是冗余的部分

  • 候选码:为一个属性组(或者属性),通过该属性组能推导出所有的属性,且若为属性组,其任意子集都不能推导出所有属性。即满足完全函数依赖的同时,还需要是最小的属性组。

    个人理解:对于数据而言,某个行(属性)或者某几个行的组合(属性组)可以确定一条数据,这个行或者这几个行的组合被称之为候选码

    题目类型:求候选码

    1. 找出一定属于候选码的属性,可能属于候选码的属性,以及不属于候选码的属性
      一定属于候选码的属性:只出现在左边,或者左右都没出现
      可能属于候选码的属性:左右都出现
      不属于候选码的属性:只出现在右边
    2. 对确定的属性做闭包运算,若不能构成候选码,再将确定的属性和待定的属性进行结合,做闭包运算,直到得到的属性组能推导出所有的属性
      闭包运算:若求某属性组的闭包,设有集合X,令X={该属性组}
      (1) X(0) = 本身,X(1) = X(0)所能推导出的
      (2)当 X(0)不等于X(1),令X(2)=X(1)属性能够推导出的
      (3)以此类推,直至X(n)=X(n-1)或X(n)等于全集时,即求得属性组的闭包
    3. 当所得的属性能够推导出所有的属性,这个属性即为候选码,对可能的组合(一定+可能)重复上述过程,可以得到所有候选码

    闭包运算还可以用于判断XYX\rightarrow{Y}是否成立:当Y属于X的闭包时,存在XYX\rightarrow{Y}

  • 超码:能推出所有属性的属性组的集合。候选码是极小的超码集,是超码的子集

  • 主码:从候选码中挑出一个作为主码,简称码

  • 主属性:包含在任意一个候选码中的属性

  • 非主属性:不包含在任意一个候选码中的属性

  • 外码:在关系模式R中,若有一个属性或者属性组X,它不是R的主码,但是是另外一个关系模式中的主码,则称之为外码

  • 全码:整个属性组都是主码

范式

  • 1NF(第一范式):所有属性都是不可分割的数据项
    例如学校,可以拆分成高中和大学,即不满足1NF;
    1NF是关系数据库需要满足的最低要求,一般讨论中都会满足第一范式;
  • 2NF(第二范式):在满足1NF的前提下,不包含非主属性对主码的部分函数依赖,即每一个非主属性都完全函数依赖于主码
    例如在某个关系中,主码是学号和班级,非主属性是姓名,若仅通过学号,不需要班级也可推导出姓名,则该关系不满足2NF
  • 3NF(第三范式):在满足2NF的前提下,不含有非主属性对码的传递函数依赖,即主码直接决定非主属性,不能间接决定
    传递函数依赖:若XY,YX,Z⊄Y,则推导出XZ{X}\rightarrow{Y},{Y}\rightarrow{X},且{Z}\not\subset{Y},则推导出{X}\rightarrow{Z},此时便是传递函数依赖
    例如某关系中,主码为客户姓名,非主属性为订单编号和订单负责人,通过客户姓名可以找到订单编号,通过订单编号可以推出订单负责人,则此时不满足3NF
  • BCNF(BC范式):消除任何属性对候选码的传递依赖,即每一个决定因素都包含候选码。其表现为在函数依赖集中,左边都包含候选码
  • 4NF(第四范式):不允许有非平凡且非函数依赖的多值依赖(不考)

最小函数依赖集

求最小函数依赖集:

  1. 拆分右侧:将右侧有多个属性的拆分成单个属性
  2. 尝试去除某个依赖关系,求闭包,试看能否通过余下推出去除的结果。能去除则删去该依赖关系
  3. 左侧最小化:对于左侧有多个属性推导出的关系,可以尝试去除某个关系,试看能否推出对应的结果

E-R图

画E-R图

image.png

E-R图转换为关系模型

image.png