показват реда в релационната алгебра

Да предположим, че имаме тази релационна схема

homebuilder (hID, hName, hStreet, hCity, hZip, hPhone)

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

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

предлага се (име, hID, mID, цена)

партида (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. (Въпреки че споменатите q и a изглежда имат някои „затруднения“.)

Друго нещо, което не можете да направите в RA (противно на SQL, който JaveLeave показва) е да имате анонимни колони, реферирани по позиция. Ако SQL беше разумен език (или изобщо какъвто и да е език), бихте могли да назовете колоната в клаузата SELECT ..., max (O.price) AS maxPrice, ... след това ORDER BY maxPrice desc. Но не, не можете да направите това. В SQL трябва да повторите ORDER BY max (O.price) desc. (Между другото, въпросът е зададен за подреждане по средна цена, а не по максимална (?) Това е колона 2.)

За разлика от операцията RA Group връща релация. И тъй като е релация, тя трябва да има атрибути, адресируеми само по име.

Обратно към зададения въпрос. Най-близкото, до което можете да стигнете до подреждане, е да поставите колона на всеки ред с поредната позиция на този ред спрямо цялата таблица. Тъй като въпросът изисква низходяща последователност, първата стъпка е да намерите подразделението с минимална средна цена и да го маркирате с порядък 1. След това изберете всички освен този, вземете минималния от тях, маркирайте го с 2. И като цяло: вземете всички немаркирани досега; вземете минимума; маркирайте го с най-високия етикет досега +1; рекурсия. Така че имате нужда от транзитивна операция за затваряне (която е друга „липсваща“ функция на стандартния RA). Можете да намерите някакъв SQL код за постигане на подобни неща в comp.database.theory -- по памет Джо Челко дава примери.

Извън темата: Озадачен съм защо курсове/преподаватели/учебници по SQL също ви молят да правите невъзможни неща в RA. Със сигурност е добре да имате заземяване в RA. Това е мощен мисловен модел за разбиране на структурите от данни, които SQL само прикрива. RA (като алгебра) е в основата на повечето SQL машини. Но защо тогава да оставяме впечатлението, че RA е някакъв „беден братовчед“ на SQL? Няма търговски реализации на RA; няма обяви за работа на RA програмисти. Защо да се опитвате да го направите това, което не е?

person AntC    schedule 27.02.2014