加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2009-03-10 16:47:48)
标签:

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两个关系

{

   Relation RS;

   RS=new (Relation);  //新建立一个新的关系的引用,用来存储笛卡尔

运算以后的结果

   RS.attributes.append(R.attributes);

        // 把关系R的所有的属性都增加到RS中

   RS.attributes.append(R.attributes);

        // 把关系S的所有的属性都增加到RS中

   Foreach(tuple r in Relation R )   // 对关系R中的每一个元组

      Foreach(tuple s in Relation S)// 对关系S中的每一个元组

      {

        tuple rs=RS.GenerateTuple();

                 //用RS关系的结构生成一个空的元组

        rs=rs.attributes.append(r);

                 //把关系R当前元组的值填充到临时元组中

        rs=rs.attributes.append(s);

                 //把关系S当前元组的值填充到临时元组中

}

RS.tuples.add(rs);

           //把临时元组追加到关系RS中。

   }

   return RS;

}

我们看到了,实际使用中的数据库管理系统并不自动取消掉重复元组,如果需要人为地强制去掉重复的元组,仍然需要加入Distinct关键字。

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

Figure 1.2.1.2.2 笛卡尔积并且取消重复元组

如上图所示,我们对两个关系进行了笛卡尔积,并且对结果进行了合并重复元组的工作。其中笛卡尔积通过Cross Join运算实现,而distinct去除重复元组。笛卡尔积在实战中没有太多的意义,但对于数据库系统来说,笛卡尔积的意义重大,因为所有的数据库查询的操作对象都是在现有的关系表之上采用有限的笛卡尔积之上进行的,都是在笛卡尔积的结果上进行选择运算(select)得到的。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有