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.
- Vypište seznam plácků (Název), které spravuje Jan Novák.
{ Hrac(jmeno='Jan Novak') * Placek }[Nazev]
- Vypište seznam všech hráčů (Jména), kteří spravují plácek, který byl někdy opravován.
{ Oprava * Placek * Hrac } [Jmeno]
- 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).
- 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]
- 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]
- 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]
- 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.