16

私はスタンフォード データベース コースに従っていますが、関係代数のみを使用して、30 歳以上の人々が食べるすべてのピザを提供するすべてのピザ屋を見つけるという質問があります。

この問題は、4 つの関係を持つ小さなデータベースで構成されています。

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 歳以上の人がどのピザを食べているかを調べて、それらの交差積を作成する方法を知っているので、どのピザ屋が両方を持っているかを調べることができました。

それらのピザを提供するすべてのピザ屋のリストを作成できますが、組み合わせが 1 つしかないピザ屋 (ドミ​​ノなど) を削除する方法がわかりません。

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

Q&A フォーラムでは、除算を使用するように指示され、いくつかのプレゼンテーションを紹介されています。アクションの結果がどうなるかはわかりますが、式をリレーショナル代数構文に変換する方法がよくわかりません。

うまくいけば解決策を完全に与えずに、私が欠けているものを誰かが説明してくれますか?

4

9 に答える 9

8

間違いなく、これは関係代数における除算演算子の概念です。

しかし、私はそのコースを試しました。RA リレーショナル代数構文は dev 演算子をサポートしていません。そこで、代わりに 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. oも持っているが持っ(12 3)(12 1)いない場合(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)とが欠落しているため、これの一部ではありません(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

交差ではなく、条件を使用して結合を試みてください。条件は、最初の関係のすべてのレコードを 2 番目の関係のすべてのレコードに一致させるのではなく、レコードを正しく一致させることを確実にします (両方の関係にある場合にのみ含める)。

于 2011-10-28T00:26:35.260 に答える
1

すべてのピッツェリアが少なくとも 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 value (1), (2), (3), (4), (5);
    mysql>カタログ値 (10,1) に挿入します。

mysql>select * カタログから;
+--------+------+
| | シド | ピッド |
+--------+------+
| | 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 * from
((カタログから sid を選択) a ,parts から個別の sid,pid を選択) b ここで
存在しない (b.sid = c.sid および b.pid = c.pid であるカタログ c から 1 を選択);

+--------+------+
| | シド | ピッド |
+--------+------+
| | 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_{ピッツェリア、ピザ} (\select_{age>30} (Person \join Eats \join Serves))

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

最終的解決:

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

\差分

( \project_{pizzeria} ( ( \project_{pizzeria} (\project_{pizzeria, ピザ} (\select_{age>30} (Person \join Eats \join Serves))) \cross \project_{pizza} (\select_ {age>30} (Person \join Eats \join Serves)) ) \diff ( \project_{ピザ屋、ピザ} (\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);

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

それはそれと同じくらい簡単です。私は何をしましたか?2 番目の部分では、30 歳以上の人が食べるピザが含まれていないピザのリストを見つけました。

どのピザ屋が若い人たちにもピザを作っているかを見るために、私はピッツェリアと一緒に参加しました。

私はピッツェリアの元のリストとは異なり、30 歳以上のピザを作っているのはシカゴ ピザだけです。

于 2018-05-12T08:49:11.983 に答える