笛卡尔积的关系代数没有重复

时间:2013-11-04 23:38:30

标签: relational-algebra cartesian-product cross-product

我有一个关系A:

    key | value
    -----------
     a  |  2
     b  |  2
     c  |  9
     d  |  5
     e  |  3

如果我自己两次执行交叉产品,我会得到三元组,如(a,b,a),(a,a,a),(a,a,b),(b,c,b我有兴趣删除所有元组,使得输出中没有键出现多次。

首先,是否存在关系代数声明?其次,是否有可能将此场景推广到多个交叉产品(即n交叉产品)?

1 个答案:

答案 0 :(得分:2)

交叉产品(通常只称为产品)是两个没有共同属性的关系的连接。除非重命名A的属性以创建新关系,否则无法自行生成A的乘积。然后,该产品将由两个关系的不同属性组成。与任何其他关系代数操作一样,产品总是与不同的元组产生关系。

你的问题有点不清楚。示例中的三元组不包含value属性,因此我不明白您希望在输出中出现哪些元组。也许你的第一个问题可以改为“是否存在一个关系代数运算,它将每个元组从一个关系连接到另一个关系中的一个任意元组,而不必指定要加入的内容?”。不存在这样的操作,因为没有正式的系统可以为您决定结果中应该包含哪个元组子集。希望这个答案“显而易见”,但如果你的问题更具体,那么也许有人可以提供更具体的答案。

关于你的第二个问题。是的,产品非常简单地概括为任意数量的操作,并且是可交换的和关联的。产品的数学定义是它是一个二元运算,但很容易想象一个类似的关系运算,它将任意数量的关系作为其操作数。