《数据库技术》1.2.1.2.4 关系的笛卡尔积

标签:
it |
分类: 数据库 |
1.2.1.2.4 笛卡尔积(Cartesian Product)
在前面我们已经介绍了多个域之间的笛卡尔积的定义,下面我们介绍两个关系之间的笛卡尔积运算。关系R(U1,U2,… Um)和S(V1,V2,… Vn)的笛卡尔积是一个m+n元组的集合,可以形式化地定义为:
R×S=
{( u1,u2,… um,v1,v2,… vn)| all possible (u1,u2,… um)∈U and (v1,v2,… vn)∈V}
即R和S的笛卡尔积是一个m+n元组集合,每一个元组的前m元都是R的成员,其后n元都是S的成员。对于理论上的关系代数,由于R中和S中都没有重复的元组,所以|R×S|=|R|×|S|,即Number(R×S)=Number(R)×Number(S)。但是在实用的应用中,在一个关系中出现完全相同的元组是很正常的事情,因为一个关系不仅要记录实体,还要记录事务、事件等等。在实际的RDBMS里是怎样处理笛卡尔积的呢?我们用过程描述语言表达如下:
CartesianOfRelations(relation R, relation S)
//参数是R和S两个关系
{
运算以后的结果
}
RS.tuples.add(rs);
}
我们看到了,实际使用中的数据库管理系统并不自动取消掉重复元组,如果需要人为地强制去掉重复的元组,仍然需要加入Distinct关键字。
Figure 1.2.1.2.2 笛卡尔积并且取消重复元组
如上图所示,我们对两个关系进行了笛卡尔积,并且对结果进行了合并重复元组的工作。其中笛卡尔积通过Cross Join运算实现,而distinct去除重复元组。笛卡尔积在实战中没有太多的意义,但对于数据库系统来说,笛卡尔积的意义重大,因为所有的数据库查询的操作对象都是在现有的关系表之上采用有限的笛卡尔积之上进行的,都是在笛卡尔积的结果上进行选择运算(select)得到的。