3.3 关系是什么
本节使用常用的供应商(supplier)关系作为示例基础。图示如下:
定义 设{H}为元组标题,t1,t2,…,tm(m>=0)为标题均是{H}的不重复元组。注3那么,{H}和元组集合{t1,t2,…,tm}的组合(设为r)即为涵盖属性A1,A2,…,An的关系值(relation value)(简记为关系)。其中,A1,A2,…,An均为{H}中的属性。关系r的标题为{H};r和该标题具有相同的属性(当然也有相同的属性名称及类型)和度。元组集合{t1,t2,…,tm}是r的主体(body)。m的值为r的基数(cardinality)。
作为练习,你可以试着用上面的定义来说明供应商关系。不过,我至少要解释一下为什么我们把这个东西叫做关系。从日常的自然语言意义上讲,关系中的每个元组代表一个n元关联(n-ary relationship),而此关联联系着n个值(每一个值对应一个元组属性);而一个确定的关系中元组的全集表示,在某个确定的时刻恰好存在的此种关联的全集;用数学语言来说,该元组集合即为关系。
因此,你经常听到的将关系模型的名称由来归因于其支持“表间关联”的说法,实际上是舍本求末的说法(尽管从某种意义上讲,这种说法也是正确的)。关系模型之所以要这么命名是因为,它所处理的抽象在我们非形式化的思维中是表,而在数学中则形式化地称为关系。
和元组一样,关系也是值,同样具有类型,并且其类型也同样具有名称。在Tutorial D中,这样的类型名称采用RELATION{H}的形式,其中{H}为标题。比如:
RELATION { SNO CHAR , SNAME CHAR , STATUS INTEGER , CITY CHAR }
其中的属性排序是任意指定的。另外,每一个关系值都由关系选择器调用来表示。比如:
RELATION
{ TUPLE { SNO 'S1' , SNAME 'Smith' , STATUS 20 , CITY 'London'} ,
TUPLE { SNO 'S2' , SNAME 'Jones' , STATUS 10 , CITY 'Paris' } ,
TUPLE { SNO 'S3' , SNAME 'Blake' , STATUS 30 , CITY 'Paris' } ,
TUPLE { SNO 'S4' , SNAME 'Clark' , STATUS 20 , CITY 'London'} ,
TUPLE { SNO 'S5' , SNAME 'Adams' , STATUS 30 , CITY 'Athens'} }
元组的顺序是任意的。下面给出另一个示例(与前一个不同,此示例不是字面值):
RELATION { tx1 , tx2 , tx3 }
此处假设tx1、tx2和tx3都是元组表达式,并且都是同一元组类型。如这些示例所示,Tutorial D中的关系选择器调用通常注4由关键字RELATION以及由大括号封闭的元组表达式列表构成(这些元组表达式必须是相同元组类型的)。
定义的推论
大多数第1章中谈及的关系性质都是上述定义的直接推论,但是还有一些要点以前没有明确说过,现在要详细说明一下。首先要说下面两点:
关系从不包含重复元组。这是因为关系的主体是一个集合(元组的集合),而数学中集合是不包含重复元素的。
关系从不包含null。这是因为关系的主体是元组集合,而元组是从不包含null的。
这两点非常重要,而且其相关内容也非常丰富,所以我会在下一章中进行详细说明。在下面几节中,我要讲一些由这个定义引申出的轻量级的议题(?)。