30歳以上の人が食べるすべてのピザを提供するすべてのピッツェリアを見つける方法

relational-algebra
30歳以上の人が食べるすべてのピザを提供するすべてのピッツェリアを見つける方法

私はスタンフォード大学のデータベースコースをフォローしていますが、30歳以上の人が食べるすべてのピザを提供するすべてのピッツェリアを見つけるには、リレーショナル代数のみを使用します。

問題は、http://s3.amazonaws.com/dbclass-resources/docs/pizza.sql [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フォーラムでは、部門とhttp://www.cs.arizona.edu/~mccann/research/divpresentation.pdfを使用するように指示されています。[いくつかのプレゼンテーションを示します。]アクションの結果がどうなるかはわかりますが、数式をリレーショナル代数構文に変換する方法を本当に理解していない。

誰かが私に不足していることを説明してもらえますか?

  16  6


ベストアンサー

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

しかし、私はそのコースで試してみました。 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)
)

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

「ドミノ」は「(最高のチーズ)」と「(最高の最高)」を見逃しているため、この一部ではありません。

6


ソリューションは、join divオペレーターhttp://en.wikipedia.org/wiki/Relational_algebra#Division_.28.C3.B7.29です。

6


クロスではなく条件を使用して結合を実行してください。 条件は、最初のリレーションのすべてのレコードを2番目のリレーションのすべてのレコードに一致させるのではなく、レコードを正しく一致させること(両方のリレーションにある場合のみ含める)を確実にします。

3


これは別の答えの注釈です。 私の脳は傷ついていたので、以前に投稿した簡潔で完全な回答を試みましたが、うまくいきました。 しかし、それは単に「男に魚を与える」だけなので、その背後にあるものを見なければなりませんでした。

次に、括弧、コメント、改行のみを変更したChrisChen3121の1月22日の’14ソリューションを示します。 ほとんどの括弧は、一致するように垂直に並んでいます。 うまくいけば、見やすくなります。 審美的に書き直されたコードに続いて、ソリューションを視覚化/概念化するために作成された中間関係があります。

短い話:

-対象のピザを見つける;

-\ 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)
    )
)
cheese
supreme

NOTE some combos do not match reality.

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

幻想的な「スーパーセット」。 これは、何が欠けているか、または「これらのピッツェリアは必要なピザを掲載していません」を表します

Dominos | supreme
Little Caesars | supreme
Straw Hat | supreme

2


すべてのピザ屋が少なくとも1種類のピザを提供しているという仮定に基づいて、30歳以上の人が食べていないピザのグループは、ピザを販売する人以外のすべてのピザ屋で販売されることがわかります30食べます。 役に立ちましたか?

1


    mysql>create table parts (pid integer);
    mysql>create table catalog (sid integer,pid integer);
    mysql>insert into parts values ( 1), (2), (3), (4), (5);
    mysql>insert into catalog values (10,1);

mysql>select * from catalog;
+------+------+
| sid  | pid  |
+------+------+
|   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;
+------+------+
| sid  | pid  |
+------+------+
|   10 |    1 |
|   10 |    2 |
|   10 |    3 |
|   10 |    4 |
|   10 |    5 |
|    1 |    1 |
|    1 |    2 |
|    1 |    3 |
|    1 |    4 |
|    1 |    5 |
+------+------+


mysql>select * from
(select distinct sid,pid from (select sid from catalog) a ,parts)  b where
not exists (select 1 from catalog c where b.sid = c.sid and b.pid = c.pid);

+------+------+
| sid  | pid  |
+------+------+
|   10 |    2 |
|   10 |    3 |
|   10 |    4 |
|   10 |    5 |
+------+------+


mysql>select distinct sid from catalog c1
where not exists (
   select null from parts p
   where not exists (select null from catalog where pid=p.pid and c1.sid=sid));
+------+
| sid  |
+------+
|    1 |
+------+

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)))

\ diff

(\ 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) )))))

1


こんにちは、私は除算演算子なしで解決策を見つけました:

\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歳以上のピザを作るのはシカゴピザだけです。

0


タイトルとURLをコピーしました