Lösningsförslag till tentamen för 1E1601

6 mars 2000

Uppgift 1

a. Modellen

b. Databasstrukturen

Enligt regel
  1. biograf(namn, adress, telefon, antalplatser)
  2. alla andra objektklasser försvinner
  3. utm(typ, titel, datum, orsak)
    biljett(titel, namn, datum, visning, plats, pris, såld?)
  4. spelar(titel, namn, roll)
  5. ger ingenting
  6. ger ingenting

Slutlig databasstruktur:
biograf (namn, adress, telefon, antalplatser)
utm (typ, titel, datum, orsak)
biljett (titel, namn, datum, visning, plats, pris, såld?)
spelar (titel, namn, roll)

Uppgift 2

U (universum) = { lghnr, husnr, gata, gatunr, ort, typ, storlek, hyra, fel, datum, pris, pnr, person, sedan }
  1. Funktionella beroenden:

    lghnr -> husnr, typ, storlek, hyra
    husnr -> gata, gatunr, ort
    lghnr, fel, datum -> pris
    pnr -> person
    lghnr, pnr -> sedan
  2. transitiva höljen

    {lghnr}+= {lghnr, husnr, typ, storlek, hyra, gata, gatunr, ort}
    {husnr}+= {husnr, gata, gatunr, ort}
    {lghnr, fel, datum}+= {lghnr, fel, datum, pris, husnr, typ, storlek, hyra, gata, gatunr, ort}
    {pnr}+= {pnr, person}
    {lghnr, pnr}+= {lghnr, pnr, sedan, husnr, typ, storlek, hyra, gata, gatunr, ort}

    Kandidatnycklar

    Enkelt resonemang:
    De attribut som kan ingå i kandidatnycklarna är de i vänsterleden i de transitiva höljena, alltså: lghnr, husnr, fel, datum, pnr.
    Av dessa bestäms husnr av lghnr, så eftersom husnr inte bestämmer någon av de övriga i listan så kan husnr inte ingå i en kandidatnyckel. De övriga behövs i varje kandidatnyckel efersom man inte kan nå alla attribut om något av dem tas bort. Testa själv med att sätta {lghnr, fel, datum, pnr} till nyckel och se om man kan nå alla attribut när något av dem tas bort.
    Alltså har vi endast en kandidatnyckel.
    1NF
    (lghnr, husnr, gata, gatunr, ort, typ, storlek, hyra, fel, datum, pris, pnr, person, sedan)
    ->2NF
    Dela upp tabellen som gav 1NF så att vi bara har tabeller där alla attribut beror av hela nyckeln.
    I tabellen nedan är det som har röd färg "det som blev över" efter det att man brutit ut någonting.
    bryt ut höljet för lghnr:
    (lghnr, husnr, gata, gatunr, ort, typ, storlek, hyra)  [ (lghnr, fel, datum, pris, pnr, person, sedan) ]
    bryt ut (det som finns kvar av) höljet för lghnr, fel, datum:
    (lghnr, fel, datum, pris)  [ (lghnr, fel, datum, pnr, person, sedan) ]
    bryt ut (det som finns kvar av) höljet för pnr:
    (pnr, person)  [ (lghnr, fel, datum, pnr, sedan) ]
    bryt ut (det som finns kvar av) höljet för lghnr, pnr:
    (lghnr, pnr, sedan)  [ (lghnr, fel, datum, pnr) ]
    Det finns ingenting kvar att bryta ut så resten blir en tabell:
    (lghnr, fel, datum, pnr)
    2NF
    (lghnr, husnr, gata, gatunr, ort, typ, storlek, hyra)
    (lghnr, fel, datum, pris)
    (pnr, person)
    (lghnr, pnr, sedan)
    (lghnr, fel, datum, pnr)
    ->3NF
    Se till att det inte finns transitiva beroenden (egenskapstermer som beror av nyckeln endast via andra egenskapstermer.
    Den enda tabellen som behöver delas är den första i uppräkningen av 2NF, där delar av tabellens egenskaper beror av lghnr endast via husnr:
    (husnr, gata, gatunr, ort)
    och kvar blir:
    (lghnr, husnr, typ, storlek, hyra)
    3NF
    (husnr, gata, gatunr, ort)
    (lghnr, husnr, typ, storlek, hyra)
    (lghnr, fel, datum, pris)
    (pnr, person)
    (lghnr, pnr, sedan)
    (lghnr, fel, datum, pnr)
  3. Man får problem vid uppdatering, insättning och borttagning.
    T.ex. kommer man att tvingas gå igenom hela tabellen om man uppdaterar ett datum då någon flyttat in i en lägenhet, även om bara några få rader skulle behöva undersökas.
    Om man ska sätta in en ny person i databasen kommer man tvingas kolla varje rad för att se att han inte redan finns i databasen.
    Om man tar bort t.ex. en lägenhet måste man kolla varje rad för att korrigera alla platser där lägenheten förekommer, oavsett sammanhang.
    Orsaken är naturligtvis redundansen som blir resultatet av att inte bryta ner strukturen.

Uppgift 3

  1. Den inre select-satsen hittar alla varor som levereras av minst två företag, så - i kombination med den yttre (där kravet är ''not exists'') blir det:
    vilka företag levererar bara varor som inget annat företag levererar?
  2. aavf kan liknas vid en tabell där man för varje par av företag och varunr får fram hur många avdelningar som har varan, levererad av det aktuella företaget, på lager. Så det blir:
    vilka företag levererar minst två varor som vardera levereras till minst två avdelningar?
  3. Vilka varutyper levereras av de företag som levererar blommor?
  4. Här gick det extra fort på genomgången och jag läste villkoret som om variablerna stod i samma ordning som i vydefinitionen, men det gör de inte. Det blir:
    vilka anställda jobbar på olika avdelningar men har samma chef?
  5. Vilka varor säljs på flest antal avdelningar?
  6. Vilka företag levererar inte varor till 5:e våningen