1.3. 关系数据模型里的操作

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

1.3.1. 关系演算

关系演算 是 E. F. Codd 于 1972 首先提出的。它包括一个对表进行操作的集合:

关于关系演算更详细的描述和定义,请参考 [Ullman, 1988] 或 [Date, 1994]。

Example 1-3. 使用关系演算的一个例子

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

πSUPPLIER.SNAMEPART.PNAME='Screw'(SUPPLIER ∏ SELLS ∏ PART))
      

我们把这样的操作称做一次查询。如果我们对我们的例子表 (供应商和部件数据库) 进行上述查询计算,我们将获得下面结果:

 SNAME
-------
 Smith
 Adams
      

1.3.2. 关系微积分

关系微积分基于 第一顺序逻辑(first order logic)。 关系微积分有两个变种:

我们只打算讨论记录关系微积分,因为它是大多数关系语言背后的数学基础。 有关 DRC(当然还有 TRC)的详细讨论,参阅 Date, 1994Ullman, 1988

1.3.3. 记录关系微积分(TRC)

TRC 里使用的查询是这样的形式:

x(A) ∣ F(x)
     
,这里x 是一个元组变量, A 是属性的集合而 F 是一个公式。生成的关系包含所有满足 F(t) 的元组 t(A)

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

{x(SNAME) ∣ x ∈ SUPPLIER ∧
    ∃ y ∈ SELLS ∃ z ∈ PART (y(SNO)=x(SNO) ∧
    z(PNO)=y(PNO) ∧
    z(PNAME)='Screw')}
     

供应商和部件数据库 计算这个查询同样得出与 使用关系演算的一个例子 相同的结果。

1.3.4. 关系演算与关系微积分之比较

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

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