基础概念

  • 实体:客观存在并可相互区别的事物。实体考研是具体的人、事、物,也可以是抽象的概念或联系。
  • 属性:实体所具有的某一特性。属性是个逻辑概念,比如说,“性别”是“人”的一个属性。在关系数据库中,属性又是个物理概念,属性可以看作是“表的一列”。
  • 元组:表中的一行就是一个元组。
  • 分量:元组的某个属性值。分量必须取原子值,即每一个分量都必须是不可分的数据项。
  • 码:唯一标识实体的属性集。
    • 候选码:如果这样的码有不止一个,那么大家都叫候选码,
    • 主码:我们从候选码中挑一个出来做老大,它就叫主码。
    • 全码:如果一个码包含了所有的属性,这个码就是全码。
  • 主属性:一个属性只要在任何一个候选码中出现过,这个属性就是主属性。
  • 非主属性:与上面相反,没有在任何候选码中出现过,这个属性就是非主属性。
  • 外码:一个属性(或属性组),它不是码,但是它别的表的码,它就是外码。

函数依赖

  • 函数依赖

设U{A1,A2,…,An}是属性集合,R(U)是U上的一个关系,x、y是U的子集。若对于R(U)下的任何一个可能的关系,均有x的一个值对应于y的唯一具体值,称y函数依赖于x(x 函数决定 y),记作x→y。 其中x称为决定因素。进而若再有y→x,则称x与y相互依赖,记作x←→y。

例如:学生号—>学生姓名,学生年龄等等有关该学生的所有信息

  • 部分函数依赖:

设R(U)是属性集U上的关系,x、y是U的子集,且 x为复合属性组 ,x’是x的真子集,若x→y且x’→y,则称y部分依赖x,记作X→PY。

  • 完全函数依赖

设R(U)是属性集U上的关系,x、y是U的子集,x’是x的真子集。若对于R(U)的任何一个可能的关系,有x→y但x’→y,则称y完全函数依赖于x,记作X→FY。
所谓完全依赖是说明在依赖关系的决定项(即依赖关系的左项)中没有多余属性,有多余属性就是部分依赖。

例子:设关系模式R,R=R(学号,姓名,班号,课程号,成绩)
“(学号,班号,课程号)→成绩”是R的一个部分依赖关系。“(学号,课程号)→ 成绩”是R的一个完全依赖关系。

传递函数依赖
设R(U)是属性集U上的关系,x、y、z是U的子集,在R(U)中,若x→y,但y!→x,若y→z,则x→z,称z传递函数依赖于x,记作X→TZ。
如果 {A1,A2,… ,An} 是关系的一个或多个属性的集合,该集合函数决定了关系的其它所有属性并且是最小的,那么该集合就称为键码。

异常

以下的学生课程关系的函数依赖为 Sno, Cname -> Sname, Sdept, Mname, Grade,键码为 {Sno, Cname}。也就是说,确定学生和课程之后,就能确定其它信息。

Sno Sname Sdept Mname Cname Grade
1 学生-1 学院-1 院长-1 课程-1 90
2 学生-2 学院-2 院长-2 课程-2 80
2 学生-2 学院-2 院长-2 课程-1 100
3 学生-3 学院-2 院长-2 课程-2 95

不符合范式的关系,会产生很多异常,主要有以下四种异常:

  • 冗余数据:例如 学生-2 出现了两次。
  • 修改异常:修改了一个记录中的信息,但是另一个记录中相同的信息却没有被修改。
  • 删除异常:删除一个信息,那么也会丢失其它信息。例如删除了 课程-1 需要删除第一行和第三行,那么 学生-1 的信息就会丢失。
  • 插入异常:例如想要插入一个学生的信息,如果这个学生还没选课,那么就无法插入。

范式

范式理论是为了解决以上提到四种异常。

高级别范式的依赖于低级别的范式,1NF 是最低级别的范式。

image.png

  1. 第一范式 (1NF)

属性不可分。

  1. 第二范式 (2NF)

符合1NF,每个非主属性完全函数依赖于键码。

  • 表必须有一个主键
  • 没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分。

可以通过分解来满足。

分解前

Sno Sname Sdept Mname Cname Grade
1 学生-1 学院-1 院长-1 课程-1 90
2 学生-2 学院-2 院长-2 课程-2 80
2 学生-2 学院-2 院长-2 课程-1 100
3 学生-3 学院-2 院长-2 课程-2 95

以上学生课程关系中,{Sno, Cname} 为键码,有如下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname
  • Sno, Cname-> Grade

Grade 完全函数依赖于键码,它没有任何冗余数据,每个学生的每门课都有特定的成绩。

Sname, Sdept 和 Mname 都部分依赖于键码,当一个学生选修了多门课时,这些数据就会出现多次,造成大量冗余数据。

分解后

关系-1

Sno Sname Sdept Mname
1 学生-1 学院-1 院长-1
2 学生-2 学院-2 院长-2
3 学生-3 学院-2 院长-2

有以下函数依赖:

  • Sno -> Sname, Sdept
  • Sdept -> Mname

关系-2

Sno Cname Grade
1 课程-1 90
2 课程-2 80
2 课程-1 100
3 课程-2 95

有以下函数依赖:

  • Sno, Cname -> Grade
  1. 第三范式 (3NF)

符合2NF,非主属性不传递函数依赖于键码。
确保每列都和主键列直接相关,而不是间接相关。

上面的 关系-1 中存在以下传递函数依赖:

  • Sno -> Sdept -> Mname

可以进行以下分解:

关系-11

Sno Sname Sdept
1 学生-1 学院-1
2 学生-2 学院-2
3 学生-3 学院-2

关系-12

Sdept Mname
学院-1 院长-1
学院-2 院长-2
  1. BC范式 (BCNF)

符合3NF,并且,主属性不依赖于主属性
若关系模式属于第一范式,且每个属性都不传递依赖于键码,则R属于BC范式。
通常BC范式的条件有多种等价的表述:每个非平凡依赖的左边必须包含键码;每个决定因素必须包含键码。BC范式既检查非主属性,又检查主属性。当只检查非主属性时,就成了第三范式。满足BC范式的关系都必然满足第三范式。还可以这么说:若一个关系达到了第三范式,并且它只有一个候选码,或者它的每个候选码都是单属性,则该关系自然达到BC范式