关系数据库以及形式化定义——载体
实体和联系都用关系这种单一的数据结构来实现
关系的定义
域(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\)的子集构成的,有意义的关系如下:
关系应该具有的六条性质
- 列是同质的(来自同一个集合,或者说是域)
- 不同的列可以出自同一个域(作笛卡尔积的集合可以重复)
- 任意两个元组不能完全相同(笛卡尔积本质还是集合,集合具有互异性)
- 列序无关性,(这里每个元组的括号是圆括号,在离散数学里面表示顺序交换仍然相同)
- 行序无关性(这个由元组构成的集合具有无序性)
- 分量必须取原子值(不能再分割了,都是基于自己定义的集合的)。
相关概念
候选码(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不能取空值。
- 实体完整性规则是针对基本关系而言的。一个基本表通常对应现实世界的一个实体集或多对多联系。
- 现实世界中的实体和实体间的联系都是可区分的,即它们具有某种唯一性标识(主码)。
- 空值就是“不知道”或“无意义”的值,不是空格字符。主属性取空值,就说明存在某个不可标识的实体,这与第2点矛盾(用NULL表示空)
参照完整性规则
几个概念
设\(F\)是基本关系\(R\)的一个或一组属性,但不是关系\(R\)的码。 如果\(F\)与基本关系\(S\)的码\(K_s\)相对应,则称\(F\)是基本关系\(R\)的外码(Foreign Key)。基本关系\(R\)称为参照关系(Referencing Relation),基本关系\(S\)称为被参照关系(Referenced Relation) 或目标关系(Target Relation)
- 关系\(R\)和\(S\)不一定是不同的关系(可以参考)
- 码\(K_s\)和外码\(F\)必须定义在同一个(或同一组)域上(有参考关系)
- 外码并不一定要与相应的主码同名(当外码与相应的主码属于不同关系时,往往取相同的名字,以便于识别,但是也存在两者处于同一关系下的情况)
上图中:
- 课程表中的\(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约束提供这类检查