关系数据模型上的操作

在上一节(Relational Data Model Formalities)里,我们定义了关系模型的数学概念。现在我们知道了用关系数据模型如何存储数据,但是我们还不知道如何从这些表里面检索某些东西。例如,某人想知道销售部件 'Screw' 的所有的供应商的名称。因此定义了两种差别相当大的用于表示对关系的操作的符号:

关系代数

关系代数是 E. F. Codd 于 1972 首先提出的。它包括一个对表进行操作的集合: 关于关系代数的更详细的描述和定义,请参考[Ullman, 1988] 或 [Date, 1994]。
 
例 69-3. 使用关系代数的一个例子

回忆一下我们阐明的所有可以用语从数据库里检索数据的关系操作符。现在我们可以回到前一章的例子里(关系数据模型里的操作),那时我们需要知道销售部件 Screw 的所有供应商的名称。现在我们可以用下面的关系代数的操作回答这个问题了:

πSUPPLIER.SNAME(σPART.PNAME='Screw'(SUPPLIER × SELLS × PART))
我们称这样的操作是一次查询。如果我们对我们的例子表(The Suppliers and Parts Database)进行上述查询计算,我们将获得下面结果:
                             SNAME
                            -------
                             Smith
                             Adams

关系微积分

关系微积分基于第一顺序逻辑(first order logic)。关系微积分有两个变种: 我们只打算讨论记录关系微积分,因为它是大多数关系语言背后的数学基础。有关DRC (当然还有 TRC)的详细讨论,参阅 Date, 1994 或 Ullman, 1988。

记录关系微积分

在 TRC 里使用的查询是这样的形式:x(A) &mid F(x),这里 x 是一个记录变量, A 是属性的集合而 F 是一个公式。生成的关系包含所有满足 F(t) 的记录 t(A)。

如果我们想用 TRC 回答例子 一个使用关系代数的查询 里的问题,我们可以写出下面查询:

     {x(SNAME) &mid x ∈  SUPPLIER ∧  \nonumber
                       &exist y ∈  SELLS &exist z  ∈  PART (y(SNO)=x(SNO) ∧  \nonumber
                        z(PNO)=y(PNO)  ∧  \nonumber
                        z(PNAME)='Screw')} \nonumber
对 供应商和部件数据库 计算这个查询同样得出与 一个使用关系代数的查询相同的结果。

关系代数与关系微积分的比较

关系代数和关系微积分有着相同的表达能力;也就是说,所有可以用关系代数表达的查询都可以使用关系微积分来表达,反之亦然。这个结论首先是 E. F. Codd 在 1972 年证明的。这个证明是基于一个算法(“Codd 的归纳算法”),利用这个算法,一个任意的关系微积分的表达式可以归纳为一个语义上相等的关系代数的表达式。关于这些更详细的讨论,请参考 Date, 1994 和 Ullman, 1988。

有时候我们说基于关系微积分的语言比基于关系代数的语言是更 "高级的" 或者 "更描述性的" 语言,因为代数(部分上)说明了操作的过程而微积分把这些过程留给编译器或者解释器以决定计算的最有效顺序。

�