2.1 关系数据库的结构
2.1 关系数据库的结构
关系数据库由表
的集合构成,每个表有唯一的名字.
一般说来,表中一行代表了一组值之间的一种联系。由于一个表就是这种联系的一个集合,表这个概念和数学上的关系这个概念是密切相关的,这也正是关系数据模型名称的由来。
元组
在数学术语中,元组只是一组值的序列(或列表)。
n元组
在n个值之间的一种联系可以在数学上用关于这些值的一个n元组(n- tuple)来表示,换言之,n元组就是一个有n个值的元组,它对应于表中的一行
等价术语
这样,在关系模型的术语中,关系
用来指代表
,而元组
用来指代行
,属性
指代的是表中的列
。
我们用关系实例
这个术语来表示一个关系的特定实例,也就是所包含的一组特定的行
元组的顺序不重要
由于关系是元组集合,所以元组在关系中出现的顺序是无关紧要的,为便于说明,当我们在显示关系时,大多数情况下都按其第一个属性排序。
域
对于关系的每个属性,都存在一个允许取值的集合,称为该属性的域( domain)
。这样instructor
关系的salary
属性的域就是所有可能的工资值的集合,而name
属性的域是所有可能的教师名字的集合。
什么是原子的域
**如果域中元素被看作是不可再分的单元,则域是原子的(atomic
)**。例如,假设instructor
表上有一个属性phone_number
,它存放教师的一组联系电话号码。那么phone_umber
的域就不是原子的,因为其中的元素是一组电话号,是可以被再分为单个电话号码这样的子成分的。
是不是原子的域与使用这个域的方式有关
重要的问题不在于域本身是什么,而在于我们怎样在数据库中使用域中元素。现在假设phone_number
属性存放单个电话号码。即便如此,如果我们把电话号码的属性值拆分成国家编号、地区编号以及本地号码,那么我们还是把它作为非原子值来对待。如果我们把每个电话号码作为不可再分的单元,那么phone_number
属性才是原子的域。
在本章,以及第3章~第6章,我们假设所有属性的域都是原子的。在第22章中,我们将讨论对关系数据模型进行扩展以便允许非原子域。
尽量避免使用空值
空值(null
)是一个特殊的值,表示值未知或不存在。如前所述,如果我们在关系instructor
中包括属性phone_number
则可能某教师根本没有电话号码,或者电话号码未提供。这时我们就只能使用空值来强调该值未知或不存在。以后我们会看到,空值给数据库访问和更新带来很多困难,因此应尽量避免使用空值。我们先假设不存在空值,然后在3.6节中我们将描述空值对不同操作的影响。