16

我正在关注斯坦福数据库课程,并且有一个问题,我们在哪里找到所有比萨饼店,这些比萨饼店只使用关系代数为 30 岁以上的人吃的每一份比萨饼提供服务。

该问题由一个具有四个关系的小型数据库组成:

Person(name, age, gender)       // name is a key
Frequents(name, pizzeria)       // [name,pizzeria] is a key
Eats(name, pizza)               // [name,pizza] is a key
Serves(pizzeria, pizza, price)  // [pizzeria,pizza] is a key

我知道如何找到 30 岁以上的人吃的比萨饼并制作它们的交叉产品,所以我可以检查哪个比萨饼店两者都有。

我可以列出所有提供这些比萨饼的比萨店,但我不知道如何删除任何只有一种组合的比萨店(如多米诺骨牌)。

Chicago Pizza   cheese  cheese
Chicago Pizza   cheese  supreme
Chicago Pizza   supreme cheese
Chicago Pizza   supreme supreme
Dominos         cheese  cheese
Dominos         cheese  supreme

问答论坛告诉我们使用除法,并为我们指出几个演示文稿。虽然我得到了动作的结果,但我并不真正了解如何将公式转换为关系代数语法。

谁能解释一下我所缺少的东西,希望没有直接给出解决方案?

4

9 回答 9

8

这绝对是关系代数中除法算子的概念。

但我尝试了那门课程。RA 关系代数语法不支持开发运算符。所以我改用了 diff 和 cross 。这是我的解决方案:

\project_{pizzeria}(Serves)
\diff
\project_{pizzeria}(
    (\project_{pizzeria}(Serves) 
    \cross 
    \project_{pizza}(\project_{name}(\select_{age>30}(Person))\join Eats))
    \diff
    \project_{pizzeria,pizza}(Serves)
)
于 2014-01-22T14:30:18.233 回答
7
  1. 在幻灯片 6 上,请注意 n 是(3 1 7)

  2. 在下一张幻灯片上,o / n结果为(4 8)

  3. If owould also have (12 3)and (12 1)but not (12 7), 12 不会是o / n.

您应该能够在幻灯片 16 的公式中填写示例并计算出来。

  1. 在您的情况下,我们认为ɑ是:

    Chicago Pizza   cheese  cheese
    Chicago Pizza   cheese  supreme
    Chicago Pizza   supreme cheese
    Chicago Pizza   supreme supreme
    Dominos         cheese  cheese
    Dominos         cheese  supreme
    
  2. 然后我们认为β是:

    cheese cheese
    cheese supreme
    supreme cheese
    supreme supreme
    
  3. 结果ɑ / β将是:

    Chicago Pizza
    

Dominos不是其中的一部分,因为它错过了(supreme cheese)and (supreme supreme)

于 2011-10-19T15:14:27.827 回答
6

解决方案是加入 div 运算符 http://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29

请参阅 http://oracletoday.blogspot.com/2008/04/relational-algebra-division-in-sql.html

于 2011-10-28T01:31:25.363 回答
3

尝试使用条件而不是交叉进行连接。条件将确保您正确匹配记录(仅当它们在两个关系中时才包括它们),而不是将第一个关系中的每个记录与第二个关系中的每个记录匹配。

于 2011-10-28T00:26:35.260 回答
3

这是另一个答案的注释。我的大脑很痛,所以我尝试了之前发布的简洁而完整的答案,它奏效了。但这只是“给男人一条鱼”,所以我必须看看背后是什么。

然后是 ChrisChen3121 的 2014 年 1 月 22 日解决方案,仅对括号、注释和换行符进行了更改。大多数括号与它们的匹配垂直排列。希望这能让事情变得容易看到。在美学上重新编写的代码之后,会产生中间关系以尝试将解决方案可视化/概念化。

长话短说:

--查找目标比萨饼;

--使用\cross,建立一个幻想超集列表,就好像所有的比萨店都提供所说的馅饼一样;

--从那里减去所有“实际供应”的馅饼以创建“这些缺失”列表;

——最后,从“现实”的[新副本]中,减去“缺失的”,然后……就是这样。

\project_{pizzeria}(Serves)// “Actual” list of what pizzerias serve. Results shown below. 
\diff
\project_{pizzeria}
(// After the diff, this is a list of "What's Missing". Results shown below
    (// Super-set of all pizzerias combined with all "over30pies". Results shown below 
     // NOTE: Some combos here do not match reality
        \project_{pizzeria}(Serves)
        \cross
        (// "over30pies": Within these parentheses produces table shown below
            //Next line is what I used, it’s effectively equivalent, yes.
            //roject_{pizza} (                \select_{age > 30 }  Person  \join Eats)
            \project_{pizza} (\project_{name}(\select_{age > 30 } (Person))\join Eats)
        )
    )
    \diff
    ( // “Actual” list of what pizzerias serve. Results shown below. 
        \project_{pizzeria,pizza}(Serves)
    )
)

// “over30pies”,目标馅饼(30 岁以上的人吃的)

cheese 
supreme

// 所有比萨店的超级集与所有目标(“over30pies”)相结合 // 注意:一些组合与现实不符。

Chicago Pizza | cheese
Chicago Pizza | supreme
Dominos | cheese
Dominos | supreme
Little Caesars | cheese
Little Caesars | supreme
New York Pizza | cheese
New York Pizza | supreme
Pizza Hut | cheese
Pizza Hut | supreme
Straw Hat | cheese
Straw Hat | supreme

// 实际的,哪些比萨店实际提供什么服务的完整列表

Chicago Pizza | cheese
Chicago Pizza | supreme
Dominos | cheese
Dominos | mushroom
Little Caesars | cheese
Little Caesars | mushroom
Little Caesars | pepperoni
Little Caesars | sausage
New York Pizza | cheese
New York Pizza | pepperoni
New York Pizza | supreme
Pizza Hut | cheese
Pizza Hut | pepperoni
Pizza Hut | sausage
Pizza Hut | supreme
Straw Hat | cheese
Straw Hat | pepperoni
Straw Hat | sausage

//从幻想的“超集”中减去“实际”后的差异(剩下的)。然后,这表示缺少什么或“<em>这些比萨店不提供列出的所需比萨”

Dominos | supreme
Little Caesars | supreme
Straw Hat | supreme
于 2016-09-19T18:19:18.460 回答
1

基于所有比萨店至少提供一种比萨饼的假设,我们会发现 30 岁以上的人不吃的比萨饼组将被所有比萨店出售,除了那些专门销售超过 30 岁的比萨饼的比萨饼店。 30 吃。有帮助吗?

于 2011-11-09T04:29:05.180 回答
1

这是http://oracletoday.blogspot.com/2008/04/relational-algebra-division-in-sql.html 到 MySQL的转换

    mysql>创建表部分(pid整数);
    mysql>创建表目录(sid整数,pid整数);
    mysql>insert into parts values (1), (2), (3), (4), (5);
    mysql>插入目录值(10,1);

mysql>从目录中选择*;
+------+------+
| 席位 | 进程号 |
+------+------+
| 10 | 1 |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
+------+------+


mysql> select distict sid,pid from (select sid from catalog) a join parts;
+------+------+
| 席位 | 进程号 |
+------+------+
| 10 | 1 |
| 10 | 2 |
| 10 | 3 |
| 10 | 4 |
| 10 | 5 |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 1 | 5 |
+------+------+


mysql>选择 * 从
(select distinct sid,pid from (select sid from catalog) a ,parts) b where
不存在(从目录 c 中选择 1,其中 b.sid = c.sid 和 b.pid = c.pid);

+------+------+
| 席位 | 进程号 |
+------+------+
| 10 | 2 |
| 10 | 3 |
| 10 | 4 |
| 10 | 5 |
+------+------+


mysql>从目录c1中选择不同的sid
不存在的地方(
   从 p 部分中选择 null
   其中不存在(从 pid=p.pid 和 c1.sid=sid 的目录中选择 null));
+------+
| 席位 |
+------+
| 1 |
+------+

于 2013-01-31T02:11:12.843 回答
1

我根据wiki在下面找到了。

R:= \project_{pizzeria, Pizza} (\select_{age>30} (Person \join Eats \join Serves))

S:= \project_{pizza} (\select_{age>30} (Person \join Eats \join Serves))

最终解决方案:

\project_{pizzeria} (\project_{pizzeria, Pizza} (\select_{age>30} (Person \join Eats \join Serves)))

\差异

( \project_{pizzeria} ( ( \project_{pizzeria} (\project_{pizzeria, Pizza} (\select_{age>30} (Person \join Eats \join Serves))) \cross \project_{pizza} (\select_ {age>30} (Person \join Eats \join Serves)) ) \diff ( \project_{pizzeria, Pizza} (\select_{age>30} (Person \join Eats \join Serves)) ) )

于 2013-03-21T22:40:59.357 回答
0

嗨,我找到了一个没有除法运算符的解决方案:

\project_{pizzeria}Serves
\diff
\project_{pizzeria}((\project_{pizza}(\select_{age < 30}Person\joinEats)
\diff\project_{pizza}(\select_{age > 30}Person\joinEats))\joinServes);

==================================================== =======================

就这么简单。我做了什么?在第二部分中,我发现披萨清单不包括 30 岁以上的人吃的披萨。

我加入了比萨饼店,看看哪些比萨饼店也为年轻人制作比萨饼。

我与最初的比萨店列表不同,唯一一家为 30 岁以上的人制作比萨的是芝加哥比萨。

于 2018-05-12T08:49:11.983 回答