DBS - 2. individuální úkol - lichý týden

Datový model z 1. úkolu lze převést do relačního modelu následovně.

Plavidlo (IDP, Kapacita, Nosnost, Barva)
Balon (IDP, Nadrz, Pisek)
Vzducholod (IDP, Baterie)
Zakaznik (IDZ, Jmeno, Adresa, Telefon)
Zamestnanec (IDZAM, Jmeno)
Kontrola (IDP, Datum, Opravy)
Vypujcka (IDV, Pujceno, Vraceno, IDP, IDZ, Vydal, Prevzal)

IO:

Balon [IDP] ⊆ Plavidlo [IDP]
Vzducholod [IDP] ⊆ Plavidlo [IDP]
Kontrola [IDP] ⊆ Plavidlo [IDP]
Vypujcka [IDP] ⊆ Plavidlo [IDP]
Vypujcka [IDZ] ⊆ Zakaznik [IDZ]
Vypujcka [vydal] ⊆ Zamestnanec [IDZAM]
Vypujcka [prevzal] ⊆ Zamestnanec [IDZAM]

Pozor na názvy atributů při přirozeném spojení :!:.

Zadání

Vyjádřete pomocí relační algebry následující dotazy.

  1. Vypište seznam plavidel (aspoň ID, barva), která byla dne 1.9.2009 vrácena (formát data např YYYY-MM-DD)
    • {Vypujcka(Vraceno='2009-09-01') * Plavidlo} [IDP, Barva]
  2. Vypište seznam všech zákazníků (Jména), kteří si půjčili již někdy kontrolované plavidlo.
    • {Kontrola * Plavidlo * Vypujcka * Zakaznik}[Jmeno]
  3. Vypište seznam výpůjček (Datum půjčení a vrácení), kterých se zúčastnil zaměstnanec Jan Novák (na pozicích předávajícího i přebírajícío :!:).
    • { Vypujcka 
          [Vypujcka.Vydal = Zamestnanec.IDZAM OR Vypujcka.Prevzal = Zamestnanec.IDZAM] 
        Zamestnanec(jmeno = "Jan Novák") }
              [Pujceno, Vraceno]
  4. Vypište seznam plavidel (ID, barva), která byla opravována v roce 2008 (tj. mezi 1.1. a 31.12., datum zapište například ve formátu YYYY-MM-DD, datum lze porovnávat pomocí operátorů >, < apod.)
    • { Kontrola (Datum >= '2008-01-01' AND Datum <= '2008-12-31') * Plavidlo } [IDP, Barva]
  5. Seznam zákazníků (Jméno, adresa), kteří si ještě nepůjčili vzducholoď (nicméně balón už mohli - ale nemuseli).
    • { Zakaznik \ {Vzducholod *> Vypujcka *> Zakaznik} } [Jmeno, Adresa]
  6. Vypište detailní seznam výpůjček, který bude obsahovat Datum půjčení a vrácení, Jméno zákazníka a obou zaměstnanců (toho, co půjčoval, a toho, který přebíral zpět).
    Příklad výstupu:
    (2009-10-10, 2009-10-15, Jan Novák, Franta Skočdopole, Tomáš Marný),
    (2009-10-09, 2009-10-20, Karel Dvořák, Franta Skočdopole, Radim Skuhra)
    • Z1 := Zamestnanec
      Z2 := Zamestnanec
      { Vypujcka * Zakaznik [Vydal = Z1.IDZAM] Z1 [Prevzal = Z2.IDZAM] Z2 } 
             [Pujceno, Vraceno, Zakaznik.Jmeno, Z1.Jmeno, Z2.Jmeno]
  7. Vypište seznam zaměstnanců, kteří již vypůjčili (tj. předali v nějaké výpůjčce) všechna plavidla, která existují. Tj. pro takové zaměstnance neexistuje plavidlo, které by nepředali v nějaké jimi vyřizované výpůjčce.
    •  { Vypujcka [Vydal -> IDZAM, IDP] ÷ Plavidlo [IDP] } *> Zamestnanec
    • Přepis pomocí dvojí negace
      Universum := Vypujcka[Vydal] x Plavidlo[IDP]
      Neuskutecnene := Universum \ Vypujcka [Vydal, IDP]
      Vyhovuji := Vypujcka[Vydal] \ Neuskutecnene [Vydal]
      Vysledek := Vyhovuji [Vydal = IDZAM> Zamestnanec
    • Více vysvětlující přepis pomocí dvojí negace
      Universum := Zamestnanec[IDZAM] x Plavidlo[IDP]
      Neuskutecnene := Universum \ Vypujcka [Vydal->IDZAM, IDP]
      Vyhovuji := Zamestnanec[IDZAM] \ Neuskutecnene [IDZAM]
      Vysledek := Vyhovuji *> Zamestnanec