2.1 关系数据库的结构
关系数据库由表(table)的集合构成,每个表有唯一的名字;
关系模型的术语中,关系用来指代表,而元组用来指代行。属性指代的是表中的列;
用关系实例来表示一个关系的特性实例,也就是所包含的一组特定的行;
对于关系的每个属性,都存在一个允许取值的集合,成为这个属性的域;如果域中元素被看作不可再分的单元,则域是原子的;(就是一个属性不能再被多个属性表示)
空 (null)指是一个特殊的值,表示值未知或不存在;空值会给数据库访问和更新带来很多困难。
2.2 关系数据库模式
需区分 数据库模式 和 数据库实例;前者是数据库的逻辑设计,后者是给定时刻数据库中数据的一个快照;
关系对应于程序设计语言中变量的概念;
关系模式 的概念对应于程序设计语言中类型定义的概念;关系模式由属性序列及各属性对应域组成;
当关系被更新时,关系实例的内容也随时间发生了变化。相反,关系的模式是不常变化的;
2.3 码
我们必须有一种能区分给定关系中的不同元组的方法。一个关系中没有两个元组在所有属性上的取值都相同;
超码 是一个或多个属性的集合,这些属性的组合可以使我们在一个关系中唯一地标识一个元组;
形式化地描述,设 $R$ 表示关系 $r$ 模式中的属性集合。如果我们说 $R$ 的一个子集 $K$ 是 $r$ 的一个超码,则限制了关系 $r$ 中任意两个不同元组不会在 $K$ 的所有属性上取值完全相等,即如果 $t_1$ 和 $t_2$ 在 $r$ 中且 $t_1\neq t_2$ , 则 $t_1.K \neq t_2.K$
超码可能包含无关紧要的属性。则如果 $K$ 是一个超码,那么 $K$ 的任意超集也是超码;
任意真子集都不能成为超码的最小超码被称为候选码( candidate key)
几个不同的属性集都可以做候选码的情况是存在的;
主码这个术语代表被数据库设计者选中的、主要用来在一个关系中区分不同元组的候选码;
- 主码的选择必须慎重:有的候选码不适合做主码
- 主码应选择那些值从不或极少变化的属性;(地址、电话号码等就不应该作为主码)
- 习惯上把主码放在其他属性前面
关系中的任意两个不同的元组都不允许同时在码属性上具有相同的值。码的指定代表了被建模的事物在现实世界中的约束;
一个关系模式(如 $r_1$)可能在它的属性中包括另一个关系模式(如 $r_2$)的主码。这个属性在 $r_1$ 上称作参照 $r_2$ 的外码 ;
关系 $r_1$ 称为外码依赖的参照关系,关系 $r_2$ 叫做外码的被参照关系 ;
参照完整性要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值;
也就是在参照关系中出现的一些属性,我们也希望他们出现在被参照关系中,但是这些属性可能不能够成被参照关系的主键,而此时还需要达成这样的约束就叫做参照完整性;
2.4 模式图
一个含有主码和外码依赖的数据库模式可以用模式图(schema diagram)来表示。
每一个关系用一个矩形来表示,关系的名字显示在矩形上方,矩形内列出各属性。
主码属性用下划线标注。
外码依赖用从参照关系的外码属性到被参照关系的主码属性之间的箭头来表示。
除外码约束外,模式图没有显示出参照完整性约束;(后面学的实体-联系图的图形化表示有助于我们表示几种约束)
2.5 关系查询语言
查询语言是用户用来从数据库中请求获取信息的语言。查询语言可以分为过程化的和非过程化的。
在 过程化语言 中,用户指导系统对数据库执行一系列操作以计算出所需结果;
在 非过程化语言 中,用户只需描述所需信息,而不用给出获取该信息的具体过程;
实际使用的查询语言两种方式都有。
有一些”纯“查询语言:关系代数是过程化的,而 元组关系演算 和 域关系演算 是非过程化的。
关系代数 包括一个运算的集合,这些运算以一个或两个关系为输入,产生一个新的关系作为结果。
关系演算 使用谓词逻辑来定义所需的结果,但不需给出获取结果的特定代数过程。
2.6 关系运算
所有的过程化关系查询语言都提供了一组运算;这些运算要么施加于单个关系上,要么施加于一对关系上,并且运算结果总是单个关系。
- 最常用的关系运算是 从单个关系(如 instructor)种选出满足一些特定谓词(如 salary > 85000美元)的特殊元组;其结果是一个新关系,它是原始关系(instructor)的一个子集;
- 另一个常用的运算是 从一个关系中选出特定的属性(列)。其结果是一个只包含那些被选择属性的新关系;
- 连接运算:把分别来自两个关系的元组对合并成单个元组;
- 自然连接:对于两个关系中的分别两个元组,如果他们在某一属性上取值相同,那么它们就是匹配的;
- 笛卡尔积:结果是包含来自两个关系元组的所有对,无论它们的属性值是否匹配;
- 集合运算:包括 并、交、集合差;
查询结果中可能包含重复值。有的查询语言严格遵守集合的数学定义,取出了重复,有的没有;
关系代数 : 关系代数定义了在关系上的一组运算,通常以一个或两个关系为输入,返回一个关系作为返回;