关系模型介绍
关系模型介绍
《数据库系统概念》第二章
关系数据库的结构
如上是教师表和课程表,教师表通过ID列标识一个教师信息,而课程表通过course_id
列标识一个课程信息。
第三个表是先修课程信息,course_id
和prereq_id
唯一标识了一条两门课之间的联系,代表prereq_id
所代表的课程是course_id
所代表课程的先修课。
而instructor
表中的一行也可以看作是ID
到(name, dept_name, salary)
之间的联系。
所以表中的一行就代表一个联系,表和数学中的关系密切相关,而数学中的元组代表具有n个组值的序列,可以看作数据库中的一行。
所以在关系模型的术语中,关系(relation)用来指代表,元组(tuple)用来指代行,属性(attribute)用来指定列。
关系实例是一个关系的特定实例,包含一组特定行,如instructor
中的十二行就是instructor
关系的一个实例。
域是属性的可取值的集合,salary
属性的域就是所有可能取值的工资的集合。
要求对于关系r,域中所有属性都是原子的,即不能再分。比如教师表中通过phone_number
属性存储教师的一组手机号,那么就不是原子的。这和你如何使用数据库中的数据有关,假设你把电话号码拆分为国家编号+地区编号+本地号码,那么即使你只存储一个手机号,那么也不是原子的。
数据库模式
关系模式是由一组关系中的属性和对应的域组成。注意关系模式不会经常更改,而上面提到的关系实例则会经常更改。
如下是department
关系,它的关系模式如下
department (dept_name, building, budget)
department
中的第一个列dept_name
在instructor
中也出现过,关系模式中使用相同属性来将不同关系中的元组联系起来。比如你想找在Watson
楼办公的所有教师,那么需要先在department
表中找到Watson
楼的所有部门名称,然后再去instructor
中按照刚刚找到的dept_name
搜索所有属于这个部门的教师。
下面的一个关系用来描述大学中一门课上课的时间段,教室等信息。大学中的一门课可能跨越不同的学期和时间段。
关系如下:
section (course_id, sec_id, semester, year, building, room_number, time_slot_id)
下面是老师和它教授的课程之间的关系
关系如下:
teaches (ID, course_id, sec_id, semester, year)
码
一些属性,如果能区分关系中不同的元组,那么就称作这些属性为“超码”(super key),关系中存在完全相同的两个属性没有意义。
例如instructor
中的ID
属性可以作为一个超码,而name属性不能,因为教师可能重名。
考虑一个问题,ID
属性可以作为唯一标识一个instructor
中的元组的超码,那么ID
+NAME
的组合也可以作为超码。我们通常感兴趣的超码是它的任何真子集都不能作为一个独立超码的超码,也就是不能够再分了,这样的超码叫做候选码(candidate key)。
主码是候选码中的一个,被数据库设计者选中,用来区分关系中不同元组的码。
如果一个关系\(r_1\)中有一个属性\(a\)存储了\(r_2\)的主码,这个属性\(a\)称为关系\(r_1\)的外码(foreign key),\(r_1\)是外码\(a\)的参照关系(referencing relation),\(r_2\)是外码\(a\)的被参照关系(referenced relation)。
比如instructor
表中的dept_name
属性就是关系department
的一个外码。无论何时,instructor
中的一个元组\(t_1\)必定能在department
中找到一个元组\(t_2\),使得它们的dept_name
属性相同。
对于之前的section
和teaches
,如果我们通过外码联系两个关系,那么要保证,如果一个特定的(course_id, sec_id, semester, year)
存在于section
,那么它必定存在于teaches
,这组值并不能构成teaches
的主码,因为可能一个课程段不只有一个老师进行授课,所以不能声明从section
到teaches
的外码约束,但可以声明从teaches
到section
的外码约束。