《1》关系模型介绍
• 在商用数据处理应用中,关系模型已经成为当今主要的数据模型。之所以占据主要位置,是因为和早期的数据模型如网络模型或层次模型相比,关系模型以其简易性简化了编程者的工作。
2.1 关系数据库的结构
• 关系数据库由表( table )的集合构成,毎个表有唯一的名字。
• 例如,图2-1中的 instructor 表记录了有关教师的信息,它有四个列首: ID 、 name 、 dept _ name 和 salary 。该表中每一行记录了一位教师的信息,包括该教师的 ID 、 name 、 dept _ name 以及 salary 。
• 类似地,图2-2中的 course 表存放了关于课程的信息,包括每门课程的 course _ id 、 title 、 dept _ name 和 credits 。注意,每位教师通过 ID 列的取值进行标识,而每门课程则通过 course _ id 列的取值来标识。
• 图2-3给出的第三个表是 prereq ,它存放了每门课程的先修课程信息。该表具有 course _ id 和 prereq _ id 两列,每一行由一个课程对组成,这个课程对表示了第二门课程是第一门课程的先修课。由此, prereq 表中的每行表示了两门课程之间的联系:其中一门课程是另一门课程的先修课。作为另一个例子,我们考察 instructor 表,表中的行可被认为是代表了从一个特定的 ID 到相应的 name 、 dept _ name 和 salary 值之间的联系。
• 一般说来,表中一行代表了一组值之间的一种联系。由于一个表就是这种联系的一个集合,表这个概念和数学上的关系这个概念是密切相关的,这也正是关系数据模型名称的由来。
• 在数学术语中,元组( tuple )只是一组值的序列(或列表)。在 n 个值之间的一种联系可以在数学上用关于这些值的一个 n 元组( n - tuple )来表示,换言之, n 元组就是一个有 n 个值的元组,它对应于表中的一行。
• 这样,在关系模型的术语中,关系( relation )用来指代表,而元组 tuple )用长指代行类似地,属性( attribute )指代的是表中的列。
• 考察图2-1,我们可以看出 instructor 关系有四个属性: ID 、 name 、 depi _ name 和 salary 。
• 我们用关系实例( relation instance )这个术语来表示一个关系的特定实例,也就是所包含的一组特定的行。图2-1所示的 instructor 的实例有12个元组。对应于12个教师。
• 本章我们将使用多个不同的关系来说明作为关系数据模型基础的各种概念。这些关系代表一个大学的一部分。它们并没有包含真实的大学数据库中的所有数据,这主要是为了简化表示。
• 由于关系是元组集合,所以元组在关系中出现的顺序是无关紧要的。因此,无论关系中的元组是像图2-1那样被排序后列出,还是像图2-4那样无序的,都没有关系;在上述两图中的关系是一样的,因为它们具有同样的元组集合。为便于说明,当我们在显示关系时,大多数情况下都按其第一个属性排序。
图2-4 instructor 关系的无序显示
• 对于关系的每个属性,都存在一个允许取值的集合,称为该属性的域( domain )。这样 instructor 关系的 salary 属性的域就是所有可能的工资值的集合,而 name 属性的域是所有可能的教师名字的集合。
• 我们要求对所有关系 r 而言, r 的所有属性的域都是原子的。如果域中元素被看作是不可再分的单元,则域是原子的( atomic )。例如,假设 instructor 表上有一个属性 phone _ number ,它存放教师的一组联系电话号码。那么 phone _ number 的域就不是原子的,因为其中的元素是一组电话号码,是可以被再分为单个电话号码这样的子成分的。
• 重要的问题不在于域本身是什么,而在于我们怎样在数据库中使用域中元素。现在假设 phone _ number 属性存放单个电话号码。即便如此,如果我们把电话号码的属性值拆分成国家编号、地区编号以及本地号码,那么我们还是把它作为非原子值来对待。如果我们把电话号码当作不可分割的单元,那么phone_number属性才会有原子的域。
• 空( null )值是一个特殊的值,表示值未知或不存在。