一、安全关系元组演算表达式
先来看一个例子,{ t | ┐( t ∈ instructor) } ,不在instructor中的元组有无限多个,且大多数这样的元组所包含的值并不在数据库中,故我们通常不希望有这样的表达式。
此时,需要对元组关系演算进行限制,引入元组关系公式P的域(domain),用dom(P)表示P所引用的所有值的集合,既包括P自身用到的值,又包括P中涉及的关系的元组中出现的所有值。P的域是P中显式出现的值及名称出现在P中的关系的所有值的集合。这里给出一个例子,dom(t∈instructor ^ t[salary] >80000) 为 :80000 和 出现在instructor中的所有值的集合;dom(┐( t ∈ instructor))为:出现在instructor中的所有值的集合。
如果出现在表达式{ t | P(t) }结果中的所有值均来自dom(P),则说该表达式是安全的。{ t | ┐( t ∈ instructor) } 不安全,,因为dom(┐( t ∈ instructor))是出现在instructor中的所有值的集合,但很可能有某个不在instructor中的元组t,它包含不在instructor中出现的值,即它允许在结果中出现不在表达式的域中的值。
安全的表达式一定包含有限的结果,因此限定只有安全的元组关系演算表达式被认为是允许的。
这里给出定义:
二、安全关系域演算表达式
同关系的元组演算,关系域演算中,也可能出现产生结果为无限关系的表达式,例如:{ <i,n,d,s> | ┐( <i,n,d,s> ∈ instructor) },它允许结果中出现不在表达式的域中的值。此外,我们还需考虑“存在”和“对所有的”子句中公式的形式。再来看下面一个例子:
在进行第二部分的测试时,还需考虑不在r中的z值,如果不考虑z的取值有无限多中可能,则无法完成对第二部分的测试。因此,需要加一些约束来限制上面这样的表达式。因为在元组关系演算中,将所有存在量词修饰的变量限制在某个关系范围内,而域关系演算中并没有这样做,故增加用于定义安全性的规则,处理上述情况。认为 { <x1,x2,...,xn>| P(x1,x2,...,xn> } 是安全的:
1.表达式的元组中所有值均来自dom(P)
2.对每个形如 存在x(P1(x))的“存在”子公式而言,子公式为真iff在dom(P1)中有某个值x使P1(x)为真
3.对每个形如 任意x(P1(x))的“对所有的”子公式而言,子公式为真iffP1(x)为真对dom(P)中所有值x均为真 (或者如上图中那样定义dom(P1)为不满足的,测试P1(x)为假)
上述规则的目的是,保证我们不需要测试无限多的可能性就可以完成对“存在”和“对所有的”子公式的测试。如果表达式是安全的,则只需对dom(P1)中的值来测试P1(x)就足够了。