Найти все пиццерии, которые подают ТОЛЬКО пиццу, которую едят люди старше 30 лет - PullRequest
0 голосов
/ 05 марта 2019

Я знаю правильный ответ, но не совсем уверен насчет ОДНОЙ его части.

Отредактированное обновление: RA - интерпретатор реляционной алгебры, который переводит запросы реляционной алгебры в запросы SQL, а затем выполняет SQL настандартная система реляционных баз данных.Таким образом, язык похож на SQL, но основан на реляционной алгебре.

Вот пример базы данных, используемой для вашей справки: Обслуживает (пиццерия, пицца, цена), ест (имя, пицца), человек (имя, возраст, пол)

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

Что мне не удаетсячтобы понять, является последней частью запроса

(\project_{pizza}((\select_{age>'30'} Person) \join Eats)))
)

Разве вы не хотите различать возраст <30, а не возраст> 30?Это будет минус все возрасты, которые меньше 30 и оставит вас со всеми возрастами> 30 нет?Тем не менее, я знаю, что это неправильно.Может кто-нибудь объяснить логику этого спасибо!

1 Ответ

0 голосов
/ 05 марта 2019

Не спешите с выводами.Читайте внимательно.

project {pizza} (select {age>'30'} (Person) join Eats)

Это выражение включает людей старше 30 лет. Но это не окончательный ответ.

Вы вычитаете эти кортежи из чего-то еще.Если вы вычитаете людей старше 30 лет из всех людей, то у вас будут люди не старше 30 лет. Это не люди старше 30 лет, и вы не вычитаете их из всех людей.Это пицца, которую едят люди старше 30 лет, и вы вычитаете ее из всех пицц, чтобы получить пиццу, которую не едят люди старше 30 лет.

    project {pizza} (Serves)
-   project {pizza} (select {age>'30'} (Person) join Eats)

Позже вы получаете пиццерии этих пицц, т.е.пиццерии, которые подают пиццу, которую не едят люди старше 30 лет.

project {pizzeria} (
        Serve
    join (
            project {pizza} (Serves)
        -   project {pizza} (select {age>'30'} (Person) join Eats)
        )

Затем вы вычитаете их из всех пиццерий, чтобы получить пиццерии, которые подают только пиццу, которую едят люди старше 30 лет.

    project {pizzeria} (Serves)
-   project {pizzeria} (
           Serve
       join (
               project {pizza} (Serves)
           -   project {pizza} (select {age>'30'} (Person) join Eats)
           )
       )

Таким образом, вы никогда не вычитаете / минусите / вычитаете людей старше 30 лет. В частности, вы никогда не вычитаете их из всех людей, чтобы получить людей не старше 30 лет.

...