4/1/2011 Úvod do databáz, skúškový test, max 25 bodov, 90 min 1. Daná je databáza: capuje(krcma, Alkohol, Cena), lubi(pijan, Alkohol) navstivil(idn, Pijan, Krcma), vypil(idn, Alkohol, Mnozstvo). Platí: Idn Pijan, Krcma; Krcma, Alkohol Cena; Idn, Alkohol Mnozstvo; Mnozstvo > 0, Cena > 0. a) Sformulujte nasledujúci dotaz v relačnom kalkule (2), Datalogu (2), SQL (2) a relačnej algebre (2): Nájdite dvojice [K, A], pre ktoré platí, že alkohol A sa vypil v krčme K vo väčšej celkovej cene než vo všetkých ostatných krčmách dohromady. Relačný kalkul: {[K, A]: T1 T2 T1 > T2 I, T1 = sum(m * C) ( P navstivil(i, P, K) vypil(i, A, M) capuje(k, A, C)) I, T2 = sum(m * C) ( K2 P A0 C0 capuje(k, A0, C0) navstivil(i, P, K2) vypil(i, A, M) capuje(k, A, C) K K2)} Datalog: answer(k, A) subtotal(vypilo_sa(k, A, S1, _), [K, A], [T1 = sum(s1)]), subtotal(vypilo_sa_inde(k, A, S2, _), [K, A], [T2 = sum(s2)]), T1 > T2. vypilo_sa(k, A, S, I) navstivil(i, _, K), vypil(i, A, M), capuje(k, A, C), S is M * C. /* S = M * C */ vypilo_sa_inde(k, A, S, I) capuje(k, _, _), navstivil(i, _, K2), vypil(i, A, M), capuje(k2, A, C), S = M * C, /* S = M * C */ not K = K2.
SQL: create temporary table total_vypilo_sa as select n.krcma, v.alkohol, sum(v.mnozstvo * c.cena) as Total from navstivil n, vypil v, capuje c where n.idn = v.idn and n.krcma = c.krcma and v.alkohol = c.alkohol group by n.krcma, v.alkohol create temporary table total_vypilo_sa_inde as select c1.krcma, v.alkohol, sum(v.mnozstvo * c2.cena) as Total from capuje c1, navstivil n, vypil v, capuje c2 where n.idn = v.idn and n.krcma = c2.krcma and v.alkohol = c2.alkohol and c1.krcma <> c2.krcma group by c1.krcma, v.alkohol select tvs.krcma, tvs.alkohol from total_vypilo_sa tvs, total_vypilo_sa_inde tvsi where tvs.krcma = tvsi.krcma and tvs.alkohol = tvsi.alkohol and tvs.total > tvsi.total Relačná algebra: Π Krcma, Alkohol ( Γ Krcma, Alkohol, T1 = sum(mnozstvo * Cena) (navstivil vypil capuje) Krcma = K2 Alkohol = A2 T1 > T2 Ρ inde(k2, A2, T2) (Γ Krcma, Alkohol, T2 = sum(mnozstvo * Cena) (Ρ capuje(k) ((Π Krcma (capuje)) K<>Krcma navstivil vypil capuje)))
b) Sformulujte nasledujúci dotaz v relačnom kalkule (2) a v Datalogu (2): Nájdite dvojice pijanov [P1, P2] také, že P1 a P2 buď vypili tú istú množinu alkoholov alebo nevypili žiaden spoločný alkohol. Relačný kalkul: {[P1, P2]: (( I K navstivil(i, P1, K)) ( A lubi(p1, A))) /* P1 je pijan */ (( I K navstivil(i, P2, K)) ( A lubi(p2, A))) /* P2 je pijan */ ( ( /* P1 a P2 vypili rovnaku mnozinu alkoholov */ A ( I K M navstivil(i, P1, K) vypil(i, A, M)) ( I K M navstivil(i, P2, K) vypil(i, A, M)) ) ( /* P1 a P2 vypili_spolocny alkohol */ A I1 K1 M1 I2 K2 M2 navstivil(i1, P1, K1) vypil(i1, A, M1) navstivil(i2, P2, K2) vypil(i2, A, M2) ) )
Datalog: answer(p1, P2) pijani(p1), pijani(p2), not vypil_nevypil(p1, P2), not vypil_nevypil(p2, P1). answer(p1, P2) pijani(p1), pijani(p2), not vypili_spolocne(p1, P2). pijani(p) navstivil(_, P, _). pijani(p) lubi(p, _). vypil_nevypil(p1, P2) vypil_pijan(p1, A), not vypil_pijan(p2, A). vypili_spolocne(p1, P2) vypil_pijan(p1, A), vypil_pijan(p2, A). vypil_pijan(p, A) navstivil(i, P, _), vypil(i, A, _).
2. a) Definujte bezstratovosť dekompozície relačnej schémy (t.j. definujte čo znamená, že dekompozícia relačnej schémy sa spája bezstratovo). (2) Dekompozícia relačnej schémy (r, F) do (r 1, F 1 ), (r 2, F 2 ),..., (r n, F n ) sa spája bezstratovo práve vtedy, keď pre každé naplnenie relácie r platí r = Πr 1 (r) Πr 2 (r)... Πr n (r) b) Aké negatívne praktické dôsledky môže mať použitie dekompozície, ktorá sa nespája bezstratovo? (1) V dekomponovanej databáze môžu prestať platiť fakty, ktoré v r platili; alebo naopak, môžu začať platiť fakty, ktoré v r neplatili. Príklad: stratová dekompozícia môže viesť k tomu, že firma platí neexistujúce faktúry; alebo neplatí existujúce faktúry; alebo posiela niekam ďaleko plný kamión vecí k niekomu, kto si tie veci neobjednal; alebo bezdôvodne odpaľuje raketu;... c) Daná je relácia r(a, B, C, D, E, F, G, H) s funkčnými závislosťami BE GH, BEG FA, D C, F B, BF A, ABG D, AGH E. Rozhodnite, či sa nasledujúca dekompozícia relácie r spája bezstratovo: (2) r1(a, B, D, G), r2(a, E, G, H), r3(a, F), r4(b, E, G), r5(b, E, H), r6(b, F), r7(c, D), r8(e, F). Ide o dekompozíciu do viacej než 2 tabuliek, takže treba použiť algoritmus chase. ABDG a1 a2 b31 a4 b51 b61 a7 b81 AF a1 b23 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 b84 BEH b15 a2 b35 b45 a5 b65 b75 a8 BF b16 a2 b36 b46 b56 a6 b76 b86 EF b18 b28 b38 b48 a5 a6 b78 b88
F B ABDG a1 a2 b31 a4 b51 b61 a7 b81 AF a1 a2 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 b84 BEH b15 a2 b35 b45 a5 b65 b75 a8 BF b16 a2 b36 b46 b56 a6 b76 b86 EF b18 a2 b38 b48 a5 a6 b78 b88 BE GH ABDG a1 a2 b31 a4 b51 b61 a7 b81 AF a1 a2 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 a8 BEH b15 a2 b35 b45 a5 b65 a7 a8 BF b16 a2 b36 b46 b56 a6 b76 b86 EF b18 a2 b38 b48 a5 a6 a7 a8 BF A ABDG a1 a2 b31 a4 b51 b61 a7 b81 AF a1 a2 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 a8 BEH b15 a2 b35 b45 a5 b65 a7 a8 BF a1 a2 b36 b46 b56 a6 b76 b86 EF a1 a2 b38 b48 a5 a6 a7 a8
ABG D ABDG a1 a2 b31 a4 b51 b61 a7 b81 AF a1 a2 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 a8 BEH b15 a2 b35 b45 a5 b65 a7 a8 BF a1 a2 b36 b46 b56 a6 b76 b86 EF a1 a2 b38 a4 a5 a6 a7 a8 D C ABDG a1 a2 a3 a4 b51 b61 a7 b81 AF a1 a2 b33 b43 b53 a6 b73 b83 BEG b14 a2 b34 b44 a5 b64 a7 a8 BEH b15 a2 b35 b45 a5 b65 a7 a8 BF a1 a2 b36 b46 b56 a6 b76 b86 EF a1 a2 a3 a4 a5 a6 a7 a8 V riadku EF sú samé a-čkové symboly. Dekompozícia je teda bezstratová. Funkčné závislosti je možné aplikovať v ľubovoľnom poradí. Pritom je dôležité zjednocovať aj b-čkové symboly (podľa algoritmu z prednášky). Môže sa stať, že niektorú funkčnú závislosť treba aplikovať viackrát (t.j. vo všeobecnosti nestačí aplikovať funkčnú závislosť maximálne raz). Algoritmus končí, keď buď niektorý riadok obsahuje len a-čkové symboly, alebo keď sa aplikáciou žiadnej funkčnej závislosti tabuľka nezmení.
3. a) Popíšte čo najpresnejšie všeobecný algoritmus obnovy (bez checkpointov). (2) Všeobecný algoritmus obnovy prechádza log-file najskôr zostupne. Počas tohto prechodu vytvára zoznamy redo_list a undo_list a zároveň robí UNDO operácie pre transakcie z undo_list. Keď príde na začiatok log-file, začne vzostupný prechod, pri ktorom vykonáva REDO operácie pre transakcie z redo_list. Keď príde na koniec logfile, začne systém normálnu prevádzku. b) Databázový systém spadol. Pred opätovným štartom obsahuje log-file nasledujúce záznamy: <T1, start>, <T1, X, 1, 2>, <T2 start>, <T3, start>, <T3, Y, 3, 2>, <T1, Y, 2, 3>, <T2, Z, 0, 1>, <T2, commit>, <T3, Z, 1, 0>. Uveďte sekvenciu priradení, ktoré sa vykonajú počas obnovy v tomto konkrétnom prípade. (2) Write-záznamy v logu sú zrejme vo formáte <trans, object, old_val, new_val>. Sekvencia priradení: Z := 1 (undo T3) Y := 2 (undo T1) Y := 3 (undo T3) X := 1 (undo T1) Z := 1 (redo T2)
4. Predpokladajte, že v operačnej pamäti sú voľné presne 4 bloky. Bloky na disku a v operačnej pamäti sú rovnako veľké, do jedného bloku sa zmestia 2 záznamy relácie r. Znázornite priebeh (popíšte najmä organizáciu operačnej pamäte) algoritmu mergesort (2) a spočítajte presný počet diskových operácií (vrátane výstupných operácií) (2) pre dotaz select r.x, r.y order by r.x, r.y a pre r(x, Y) = <[7, 8], [4, 9] [2, 1], [7, 6] [3, 9], [5, 7] [8, 1], [7, 9] [3, 4], [2, 2] [2, 1], [3, 2] [1, 6], [1, 5] [4, 9], [4, 2] [3, 5], [1, 7] [4, 6], [1, 8]>. (Znak slúži ako oddeľovač blokov.) V prvej fáze sa všetky 4 bloky v RAM použijú na čítanie blokov r. V RAM sa záznamy utriedia a následne zapíšu do behu. Toto sa opakuje, kým sa neprečíta celá r. RAM: [7, 8], [4, 9] [2, 1], [7, 6] [3, 9], [5, 7] [8, 1], [7, 9] RUN1: <[2, 1], [3, 9] [4, 9], [5, 7] [7, 6], [7, 8] [7, 9], [8, 1]> RAM: [3, 4], [2, 2] [2, 1], [3, 2] [1, 6], [1, 5] [4, 9], [4, 2] RUN2: <[1, 5], [1, 6] [2, 1], [2, 2] [3, 2], [3, 4] [4, 2], [4, 9]> RAM: [3, 5], [1, 7] [4, 6], [1, 8] RUN3: <[1, 7], [1, 8] [3, 5], [4, 6]>
V druhej fáze sa behy spájajú do väčších behov. 3 bloky v RAM použijú na čítanie 3 behov, 1 blok RAM sa použije na výstup. Keď sa výstupný blok zaplní, zapíše sa do výstupného behu. Keď sa niektorý zo vstupných blokov vyprázdni, prečíta sa ďalší blok z príslušného vstupného behu. RAM (output block last): [2, 1], [3, 9] [1, 5], [1, 6] [1, 7], [1, 8] [2, 1], [3, 9] [1, 5], [1, 6] [1, 7], [1, 8] [1, 5], [1, 6] [2, 1], [3, 9] [1, 5], [1, 6] [1, 7], [1, 8] [1, 5], [1, 6] [2, 1], [3, 9] [2, 1], [2, 2] [1, 7], [1, 8] [2, 1], [3, 9] [2, 1], [2, 2] [1, 7], [1, 8] [1, 7], [1, 8] [2, 1], [3, 9] [2, 1], [2, 2] [1, 7], [1, 8] [1, 7], [1, 8] [2, 1], [3, 9] [2, 1], [2, 2] [3, 5], [4, 6] [2, 1], [3, 9] [2, 1], [2, 2] [3, 5], [4, 6] [2, 1], [2, 1] [2, 1], [3, 9] [2, 1], [2, 2] [3, 5], [4, 6] [2, 1], [2, 1] [2, 1], [3, 9] [2, 1], [2, 2] [3, 5], [4, 6] [2, 2] [2, 1], [3, 9] [3, 2], [3, 4] [3, 5], [4, 6] [2, 2] [2, 1], [3, 9] [3, 2], [3, 4] [3, 5], [4, 6] [2, 2], [3, 2] [2, 1], [3, 9] [3, 2], [3, 4] [3, 5], [4, 6] [2, 2], [3, 2] [2, 1], [3, 9] [3, 2], [3, 4] [3, 5], [4, 6] [3, 4] [2, 1], [3, 9] [4, 2], [4, 9] [3, 5], [4, 6] [3, 4] [2, 1], [3, 9] [4, 2], [4, 9] [3, 5], [4, 6] [3, 4], [3, 5] [2, 1], [3, 9] [4, 2], [4, 9] [3, 5], [4, 6] [3, 4], [3, 5] [2, 1], [3, 9] [4, 2], [4, 9] [3, 5], [4, 6] [3, 9] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [3, 9] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [3, 9], [4, 6] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [3, 9], [4, 6] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [4, 2], [4, 9] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [4, 2], [4, 9] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [4, 9] [4, 9], [5, 7] [4, 2], [4, 9] [3, 5], [4, 6] [4, 9], [5, 7] [7, 6], [7, 8] [4, 2], [4, 9] [3, 5], [4, 6] [4, 9], [5, 7] [7, 6], [7, 8] [4, 2], [4, 9] [3, 5], [4, 6] [7, 6], [7, 8] [7, 6], [7, 8] [4, 2], [4, 9] [3, 5], [4, 6] [7, 6], [7, 8] [7, 9], [8, 1] [4, 2], [4, 9] [3, 5], [4, 6] [7, 6], [7, 8] [7, 9], [8, 1] [4, 2], [4, 9] [3, 5], [4, 6] [7, 9], [8, 1]
V prvej fáze sa každý záznam r raz prečíta a raz zapíše. V druhej fáze sa prečíta a zapíše rovnako veľa blokov (ak druhú fázu netreba opakovať, t.j. ak počet behov nie je väčší než M-1, kde M je veľkosť RAM). To znamená, že spolu sa urobí 20 vstupných a 20 výstupných operácií (keďže r má 10 blokov).