为什么我会得到所有的比萨(关系代数)和我的联合搞乱?

时间:2014-08-30 22:59:00

标签: relation relational-algebra

这是我用于查询的数据库

https://class.stanford.edu/c4x/DB/RA/asset/pizzadata.html

写出关系代数查询的语法基于http://www.cs.duke.edu/~junyang/ra/

我的询问是“找到至少一名20岁以上的女性吃过的所有比萨饼。” 这就是我到目前为止所拥有的

\project_{name,pizza}(
Person \join_{gender='female' and age>20} Eats
)

我认为我在这里有正确的逻辑。(“\ join_ {cond}是关系theta-join运算符。”)我还显示了名称列以进行调试。我正在加入两个关系,只保留性别为女性和年龄的行> 20.

我的查询结果(针对正确的查询)。我不认为这是一个语法问题。在Eats关系中,Fay只吃蘑菇。我不明白为什么她会与每个披萨组合配对

enter image description here

1 个答案:

答案 0 :(得分:2)

Theta加入是笛卡尔式的;他们将每个表的每一行与每个其他表的每一行连接起来。在您的示例中,无论Person如何,您都会加gender='female' and age>20 Eats行的每一行name。你可能想要:

Person \join_{gender='female' and age>20 and name=eater} \rename{eater, pizza} Eats

请注意,Thetas通常会增加行数;您通常会减少使用Sigmas或选择返回的行数。执行语句的更惯用的方法是使用Select和自然连接:

\select{gender='female' and age>20} Person \join Eats