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

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

Hrac (IDH, Jmeno, Narozen)
Zapas (IDZ, Datum_konani, Vyzyvajici, Vyzvany, IDP)
Ligovy (IDZ, Skore1, Skore2)
Exhibice (IDZ, Penize)
Placek (IDP, Nazev, IDH)
Oprava (IDP, Datum, Popis)

IO:
Zapas[Vyzyvajici] ⊆ Hrac[IDH]
Zapas[Vyzvany] ⊆ Hrac[IDH]
Zapas[IDP] ⊆ Placek[IDP]
Ligovy[IDZ] ⊆ Zapas[IDZ]
Exhibice[IDZ] ⊆ Zapas[IDZ]
Placek[IDH] ⊆ Hrac[IDP]
Oprava[IDP] ⊆ Placek[IDP]

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

Zadání + řešení

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

  1. Vypište seznam plácků (Název), které spravuje Jan Novák.
    • { Hrac(jmeno='Jan Novak') * Placek }[Nazev]
  2. Vypište seznam všech hráčů (Jména), kteří spravují plácek, který byl někdy opravován.
    • { Oprava * Placek * Hrac } [Jmeno]
  3. Vypište seznam exhibic (Datum a peníze), kterých se zúčastnil Jan Novák (na pozicích vyzvaného i vyzývajícího :!:).
    •  { Hrac(jmeno='Jan Novak') [Hrac.IDH = Zapas.Vyzyvajici OR Hrac.IDH = Zapas.Vyzvany] Zapas * Exhibice } [Datum, penize] 
      • Pokud připustíme, že lze do join podmínky napsat libovolný boolovský výraz. Alternativně lze použít sjednocení (union) dvou dotazů (jeden na vyzývajícího, druhý na vyzvaného).
  4. Vypište seznam plácků (Název), které byly opravovány 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.)
    • { Oprava(Datum ≤ 2008-12-31 AND Datum ≥ 2008-01-01) * Placek } [Nazev] 
  5. Seznam hráčů (Jména, datum narození), kteří ještě nehráli exhibici.
    •  { Hrac \ { Exhibice *> Zapas [Hrac.IDH = Zapas.Vyzyvajici OR Hrac.IDH = Zapas.Vyzvany> Hrac } } [Jmeno,Narozen] 
  6. Vypište detailní seznam zápasů, který bude obsahovat Datum, Jména obou hráčů a název plácku.
    Příklad výstupu:
    (2009-10-10, Jan Novák, Franta Skočdopole, U řeky),
    (2009-10-09, Franta Skočdopole, Radim Skuhra, Nad náměstím)
    • H1:= Hrac
      H2:= Hrac
      Vysledek := { Placek * Zapas [Zapas.Vyzvany = H1.IDH] H1 [Zapas.Vyzyvajici = H2.IDH] H2 } [Datum, H1.Jmeno, H2.Jmeno, Placek.Nazev] 
  7. Vypište seznam hráčů, kteří hráli na pozici vyzývajícího na všech hřištích, která existují (tj. neexistuje hřiště, na kterém by daný hráč nehrál).
    • { Zapas [Vyzyvajici->IDH, IDP] ÷ Placek[IDP] } *> Hrac
    • Přesný opis operace dělení pomocí dvojí negace
      Universum := Zapas[Vyzyvajici->IDH] X Placek [IDP]
      Neuskutecnene := Universum \ Zapas [Vyzyvajici->IDH, IDP]
      Splnili := Zapas[Vyzyvajici->IDP] \ Neuskutecnene [IDH]
      Vysledek := Splnili *> Hrac
    • Alternativně opis (ne úplně podle definice operace děleno, ale srozumitelnější) pomocí dvojí negace.
      Universum := Hrac[IDH] X Placek[IDP]
      Neuskutecnene := Universum \ Zapas [Vyzyvajici->IDH, IDP]
      Splnili:= Hrac[IDH] \ Neuskutecnene [IDH]
      Vysledek:= Splnili *> Hrac
    • Všimněte si, že se oba opisy liší tím, že v prvním případě neuvažujeme všechny hráče, ale jen ty, kteří opravdu něco sehráli.