有人可以解释一下笛卡尔积在关系代数中的作用

时间:2011-10-10 14:41:48

标签: cartesian-product relational-algebra

here它说

选择和交叉产品

交叉产品是评估最昂贵的运营商。如果输入关系具有N和M行,则结果将包含NM行。因此,在应用交叉乘积运算符之前,尽量减小两个操作数的大小非常重要。

假设我们有两个关系

第一个关系称为学生,有3个属性,因此

    student
  |a |b   |c |
  ------------
  |__|___|___|
  |__|___|___|
  |__|___|___|

第二个关系是大学,再次有3个属性

   university
  |e |f   |g |
  ------------
  |__|___|___|
  |__|___|___|
  |__|___|___|

每个关系有3行,所以在应用了叉积运算后,我们将得到一个有3 * 3 = 9行的关系

现在,我不明白,为什么9而不是3?

最终的关系不是

 final relation
 |a |b   |c |d |e   |f |g |
 --------------------------
 |__|___|___|__|____|__|__|
 |__|___|___|__|____|__|__|
 |__|___|___|__|____|__|__|

这又不是3行吗?

由于

4 个答案:

答案 0 :(得分:5)

如果Student中的行是row1,row2和row3,而University中的行是row4,row5和row6,那么笛卡尔积将包含

row1row4,row1row5,row1row6,row2row4,row2row5,row2row6,row3row4,row3row5,row3row6

每个可能的行组合。这就是它的定义方式。没有更多的东西。

除了您的评论“因此,在应用交叉产品运算符之前,尽量减少两个操作数的大小非常重要。”重要的是要意识到存在能够“重写”某些代数运算的优化器。当然,情况并非总是在查询编写者身上确定“将限制与其他操作相结合的最合适方式”。事实上,“尽可能将限制移到内部”是工业优化者实际上非常擅长的事情之一。

答案 1 :(得分:2)

想象一下,你有两个表与学生和一个与大学的表,当你对关系数据库进行笛卡尔查询时,你会得到每个学生的一行,而每个学生都加入到每所大学。

Select *
   From students, 
        universities;

OR

SELECT * FROM students CROSS JOIN universities

我知道这与代数关系不大,但是因为你的堆栈溢出:D

答案 2 :(得分:0)

学生和大学之间没有共同的属性,所以学生的每一行都与大学的每一行相匹配,3 * 3 = 9

答案 3 :(得分:0)

| A | E | | A | A | | A | G | | B | E | | B | F | | B | G | | C | E | | C | F | | C | G |

因此9