关系数据库

关系数据库以及形式化定义——载体

实体和联系都用关系这种单一的数据结构来实现

关系的定义

  • 域(Domain):一组具有相同数据类型的值的集合。如整 数、字符串等。

  • 笛卡尔积(Cartesian Product):给定一组域$D1, D2, …, Dn $(可相同), \(D1, D2, …, Dn\)上的笛卡尔积为: \(D1× D2 × … × Dn=\){ \((d1, d2, …, dn) | di = 1, 2 , …, n\)} ,笛卡尔积的很多结果都是无意义的,有意义的一般都是其子集构成的关系

  • \((d1, d2, …, dn)\)称为一个元组(Tuple)

  • \(di\)叫作元组\((d1, d2, …, dn)\)的第$i $个分量(component)

  • 关系(Relation): \(D1× D2 × … × Dn\)的一个子集叫做域 \(D1, D2, …, Dn\)上的关系。

  • 定义在\(n\)个域上的关系称为\(n\)元(\(n\)目)关系

  • 例子

    • 给定域\(name=\){\(王小明,李莉\)},\(sex=\){\(男,女\)},则\(name ×sex\)={\((王小明,男),(王小明,女),\)\((李莉,男),(李 莉,女)\)}

    • 一个由\(name×sex\)的子集构成的,有意义的关系如下:

关系应该具有的六条性质

  1. 列是同质的(来自同一个集合,或者说是域)
  2. 不同的列可以出自同一个域(作笛卡尔积的集合可以重复)
  3. 任意两个元组不能完全相同(笛卡尔积本质还是集合,集合具有互异性)
  4. 列序无关性,(这里每个元组的括号是圆括号,在离散数学里面表示顺序交换仍然相同)
  5. 行序无关性(这个由元组构成的集合具有无序性)
  6. 分量必须取原子值(不能再分割了,都是基于自己定义的集合的)。

相关概念

  • 候选码(Candidate Key):能唯一标识元组的属性(组)(可以有多个,见下面例子)

  • 主码(Primary Key):多个候选码中选定一个作主码

  • 主属性(Prime Attribute):候选码中的各个属性

  • 非主属性(Non-Key Attribute):不出现在任何候选码中的属性

  • 关系的型与值

    • 关系(表)的型:关系的结构(字段名、字段个数、域等)
    • 关系(表)的值:关系中具体的元组,也称关系的实例 (Instance)
  • 关系模式(Relation Schema)即关系的型的定义

关系操作

基本的关系操作

五种基本的操作指的是——并(Union)、差(Difference)、广义笛卡儿积、选择(Select)、投影(Project)【UD广SP】

  • 查询(Query)
    • 并(Union)、交(Intersection)、差(Difference)、广义笛卡尔积、选择(Select)投影(Project)、连接(Join)、除(Divide)
  • 插入(Insert)
  • 删除(Delete)
  • 修改(Update)

关系操作的特点:操作对象和操纵结果都是关系(体现了封闭性)

关系语言

  • 关系代数
  • 关系演算(逻辑)(基于一阶逻辑)
    • 元组演算(一行)
    • 域演算(一列)
  • SQL(用得最多)
  • 关系语言特点
    • 关系语言是一种高度非过程化的语言
    • 关系语言是完备的
    • 关系代数、元组关系演算和域关系演算三种语言在表达能力上完全等价

关系的完整性——约束

实体完整性规则

若属性A是基本关系R的主属性,则属性A不能取空值。

  1. 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集或多对多联系。
  2. 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识(主码)
  3. 空值就是“不知道”或“无意义”的值,不是空格字符。主属性取空值,就说明存在某个不可标识的实体,这与第2点矛盾(用NULL表示空)

参照完整性规则

几个概念

\(F\)是基本关系\(R\)的一个或一组属性,但不是关系\(R\)的码。 如果\(F\)基本关系\(S\)的码\(K_s\)相对应,则称\(F\)是基本关系\(R\)外码(Foreign Key)。基本关系\(R\)称为参照关系(Referencing Relation),基本关系\(S\)称为被参照关系(Referenced Relation) 或目标关系(Target Relation)

  1. 关系\(R\)\(S\)不一定是不同的关系(可以参考)
  2. \(K_s\)和外码\(F\)必须定义在同一个(或同一组)域上(有参考关系)
  3. 外码并不一定要与相应的主码同名(当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别,但是也存在两者处于同一关系下的情况)

上图中:

  • 课程表中的\(Cpno\)参考了课程表中的\(Cno\) (自己参考自己,外码的值来自被参照关系,也可以为空)
  • 成绩表中的\(Sno\)参考了学生表中的\(Sno\) (前者是外码,此时两者同名)
  • 成绩表中的\(Cno\)参考了课程表中的\(Cno\) (前者是外码,此时两者同名)

参照完整性规则

若属性(或属性组)\(F\)是基本关系\(R\)的外码,它与基本关系\(S\)的码\(K_s\)相对应(基本关系\(R\)\(S\)不一定是不同的关系),则对于\(R\)中每个元组在\(F\)上的值必须为以下两者之一:

  • 或者取空值(\(F\)的每个属性值均为空值)
  • 或者等于\(S\)中某个元组的码值。

举个例子:

  • 在前面的\(SC\)表中,\(Sno\)只能取S表中存在的学号,\(Cno\)也只能取已存在的课程号,但两者都不能取空值,因为\(Sno\)\(Cno\)都是主属性

  • 外码中的属性如果不是主属性,则可以取空值,此时外码中的每个属性均为空值

    • 可以看到考生录取表中的\(Yxdh\)\(Zydh\)是参考的院校专业表里面的\(Yxdh\)\(Zydh\)。这两者同时继承被参考关系的值,或者全为空值,否则都是不合法的。

用户定义完整性规则

  • 用户定义的完整性是针对某一具体关系数据库的约束条件, 反映某一具体应用所涉及的数据必须满足的语义要求。如性 别只能取“男” 、 “女”值,成绩必须在0~100分之间。
  • 关系模型应提供定义和检验这类完整性的机制,以便用统一 的系统的方法处理它们,而不要由应用程序承担这一功能。 通常由DBMS的Check约束提供这类检查