отображать порядок в реляционной алгебре

Предположим, у нас есть эта реляционная схема

домостроитель (hID, hName, hStreet, hCity, hZip, hPhone)

model(hID, mID, mName, sqft, story)

подразделение(sName, sCity, sZip)

Предлагаемый(sName, hID, mID, цена)

lot(sName, lotNum, lStAddr, lSize, lPremium)

продан(sName, lotNum, hID, mID, статус)

У меня проблема с выполнением реляционной алгебры для каждого подразделения, найти количество предлагаемых моделей и среднюю, минимальную и максимальную цену моделей, предлагаемых в этом подразделении. Также отобразите результат в порядке убывания средней цены дома.

Я закончил с формулой SQL, но мне сложно перевести этот SQL в реляционную алгебру. Кто-нибудь может мне помочь? Вот что я получил до сих пор:

SQL:= 
    SELECT S, avg (O.price), min (O.price), max (O.price), count(*)
    FROM   offered O, subdivision S
    WHERE O.sName = S.sName
    GROUP BY S.sName
    ORDER BY 4 desc;

person JavaLeave    schedule 27.02.2014    source источник
comment
Обратите внимание, что, как указано здесь и здесь вы не можете упорядочивать в реляционной алгебре.   -  person DPenner1    schedule 27.02.2014


Ответы (1)


+1 к комментарию DPenner: совершенно верно, что вы не можете делать заказы в РА. (Хотя эти вопросы и ответы, похоже, имеют некоторые «трудности».)

Еще одна вещь, которую вы не можете сделать в RA (в отличие от SQL, который показывает JaveLeave), - это иметь анонимные столбцы, на которые ссылаются по положению. Если бы SQL был разумным языком (или вообще любым языком), вы могли бы назвать столбец в предложении SELECT ..., max (O.price) AS maxPrice, ... затем ORDER BY maxPrice desc. Но нет, вы не можете этого сделать. В SQL вам нужно повторить ORDER BY max (O.price) desc. (Кстати, вопрос задан для заказа по средней цене, а не по максимальной (?) Это столбец 2.)

В отличие от этого операция группы RA возвращает отношение. А будучи отношением, оно должно иметь атрибуты, к которым можно обращаться только по имени.

Вернемся к заданному вопросу. Самое близкое к порядку, которое вы можете получить, — это поместить столбец в каждую строку с порядковым положением этой строки относительно всей таблицы. Поскольку вопрос требует убывающей последовательности, первый шаг - найти подразделение с минимальной средней ценой и пометить его порядковым номером 1. Затем выбрать все, кроме этого, получить минимум тех, пометить его 2. И в целом: взять все еще не помеченные; получить минимум; пометить его самым высоким тегом на данный момент +1; рекурсия. Итак, вам нужна операция транзитивного замыкания (еще одна «отсутствующая» функция стандартного RA). Вы можете найти некоторый код SQL для достижения такого рода вещей в comp.database.theory - по памяти Джо Селко приводит примеры.

Не по теме: я озадачен, почему курсы/преподаватели/учебники по SQL также просят вас делать невозможные вещи в RA. Конечно хорошо иметь заземление в РА. Это мощная ментальная модель для понимания структур данных, которые SQL только скрывает. RA (как алгебра) лежит в основе большинства механизмов SQL. Но тогда почему создается впечатление, что RA — своего рода «бедный родственник» SQL? Коммерческих реализаций RA нет; нет объявлений о вакансиях для программистов РА. Зачем пытаться сделать из него то, чем оно не является?

person AntC    schedule 27.02.2014