Kontakt:
- rjasko (zavinac) dcs.fmph.uniba.sk
Úvod do databázových systémov - Cvičenia 2016/2017 ZS
Ján Mazák, M255, mazak at dcs.fmph.uniba.sk
Michal Rjaško, rjasko at dcs.fmph.uniba.sk
Zobraziť výsledky.
2. Bonusová DÚ
-
Len pre tých, ktorí chodia na cvičenia v pondelok (cvičiaci Michal Rjaško), keďže tí majú o jednu rozcvičku menej
-
Zadanie:
Systém na evidenciu bezpečnostných incidentov potrebuje evidovať nasledovné údaje:
-
Používateľ: Meno, Priezvisko, Login, Heslo, Oddelenie
-
Incident: názov (krátky text), text/popis, dátum a čas pridania, autor (používateľ)
-
Kategórie incidentov: názov, popis
- Každý incident je zaradený do niekoľkých kategórií
- Každý používateľ je zaradený do niekoľkých kategórií (aké incidenty sa ho týkajú)
-
Tagy incidentov: názov, hodnota, autor, dátum a čas pridania
- Používatelia môžu každý incident otagovať - dvojicou (názov tagu, hodnota). Názov aj hodnota môžu byť akýkoľvek text
-
"Like": Používatelia môžu daný incident "likeovať", t.j. zahlasovať za jeho dôležitosť. O každom incidente chceme evidovať, ktorí používatelia ho likeovali (jeden incident môže používateľ likeovať len raz).
Vašou úlohou je:
- Navrhnite štruktúru databázy tak, aby bola v 3NF (stačia názvy tabuliek a atribútov, netreba typy)
- Nakreslite ER (entitno-relačný) diagram s návrhom databázy
-
Napíšte SQL dotaz, ktorý vráti zoznam incidentov v tvare:
(názov incidentu, autor incidentu, počet tagov priradených incidentu, dátum posledného tagu, počet likeov incidentu)
pre aktuálne prihláseného používateľa, povedzme že login má 'fero'. Používateľ vidí len incidenty zaradené do jeho kategórií a zároveň vidí len také, ktoré neboli otagované používateľom z rovnakého oddelenia ako je prihlásený používateľ (t.j. akoby si otagovaním incident beriem na zodpovednosť).
Upozorňujeme, že v zozname musia byť incidenty aj bez likeov a tagov (t.j. s počtom tagov 0 alebo likeov 0).
-
Termín odovzdania do 8.12.2016 23:59:59
- Úlohu odovzdajte emailom svojmu cvičiacemu na rjasko (at) dcs.fmph.uniba.sk.
-
Za úlohu môžete dostať max. 6 bodov
1. Bonusová DÚ
- Zadanie:
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
We say that a drunkard D optimizes his drinking if for every alcohol A, he drinks A only in pubs that serve it for the lowest price possibly with the exception of his first drinking of A (he can taste it for the first time anywhere). Find all pubs (visited at least once) that are visited only by drunkards who never failed to optimize they drinking. (Assume that ids of visits represent timestamps, i.e. a visit with a smaller id was done sooner than any visit with a larger id; the ids are pairwise distinct.)
-
Úlohu vypracujte v SQL a v relačnej algebre (t.j. v obidvoch jazykoch).
-
Termín odovzdania do 23.11.2016 23:59:59
-
Úlohu odovzdajte emailom svojmu cvičiacemu na rjasko (at) dcs.fmph.uniba.sk / mazak (at) dcs.fmph.uniba.sk.
-
Max. počet bodov je 6 za každý jazyk, pričom do celkového hodnotenia sa započíta maximum bodov z týchto dvoch jazykov (t.j. za úlohu získate max. 6 bodov)
Zadania rozvičiek
- 30.11.2016
V relácii r(A, B, C, D, E, F, G, H) platia funkčné závislosti ACDH → CE, ACDF → EG, C → H, EF → BEG.
Najdite minimalne pokrytie a bezstratovu dekompoziciu r do 3NF.
- 28.11.2016
V relácii r(A, B, C, D, E, F, G) platia funkčné závislosti ABCD → EF; ABE → FG; ABDG → CF; G → BD.
Nájdite min. pokrytie a dekomponujte r do 3NF bezstratovo a so zachovaním funkčných závislostí.
- 21.11.2016
Uvažujme reláciu r(A,B,C,D,E,F,G,H) s funkčnými závislosťami
F = {A→D, A→G, E→B, AC→B, A→D, AC→E, BG→C, BG→F, E→D, BH→E, BCD→G, BCD→H, BDG→A}
Nájdite minimálne pokrytie danej množiny funkčných závislostí.
- 16.11.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite všetkých pijanov, ktorí navštevujú len krčmy, ktoré čapujú len alkoholy, ktoré majú radi (nie nutne všetky) a navštívili krčmu aspoň raz.
- 14.11.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite všetky dvojice [K, R], kde K je krcma, ktorú niekto navštívil, a R je podiel sklamaných pijanov, ciže podiel poctu pijanov, ktorí K navštívili, ale nelúbia žiaden alkohol, ktorý K capuje, k celkovému poctu pijanov, ktorí K navštívili.
- 7.11.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite trojice [P, K, Pocet], ktoré hovoria pri koľkých (Pocet) návštevách vypil pijan P v krčme K aspoň 5 borovičiek na jedno posedenie.
- 24.10.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite alkoholy, ktoré čapuje krčma Stein, ale nikdy ich tam nik nepil
- 19.10.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite všetky dvojice P, K také, že P pil v K aspoň raz a každý alkohol, ktorý vypil P v K, bol vypitý v presne jednej inej krčme.
- 17.10.2016
EBD={Kurz(ID, Ucitel, Predmet); Navstevuje(Student, KurzID); Hodnotenie(Student, KurzID, Znamka);}
Nájdite všetky dvojice [U, S], kde S je študent, ktorý má na všetkych kurzoch s učiteľom U len známky horšie ako 2, ale na všetkých ostatných kurzoch ma samé 1 (t.j. akoby si učitel U "zasadol" na študentovi S).
- 12.10.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
nájdite všetky alkoholy, ktoré majú radi pijani, ktorí nikdy nenavštívili "Slovak pub". (pijani su tí, čo majú radi nejaký alkohol)
- 10.10.2016
EDB={lubi(Pijan, Alkohol), capuje(Krcma, Alkohol), navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
Nájdite dvojice [K, A] také, že krčma K čapuje alkohol A, a zároveň každý pijan, ktorý ľúbi alkohol A, ho vypil pri niektorej návšteve krčmy K (čiže tú krčmu aj navštívil) (datalog)
- 5.10.2016
EDB: {subordinate(Employee, Superior); emp(Employee)}
Find all employees X that are direct superiors of precisely one ordinary employee (i.e. employee without subordinates); we do not care about non-ordinary or non-employee subordinates of X.
- 3.10.2016
EDB: {Part(Name); Component(Item, Subitem, AttachementType)}
Nájdite súčiastky, ktoré pozostávajú z najviac jednej atomickej súčiastky (t.j. vo výsledku budú len atomické súčiastky, alebo súčiastky pozostávajúce z práve jednej atomickej súčiastky a žiadnej inej). Atomická súčiastka je taká, ktorá nemá žiadne podsúčiastky v tabuľke Component.
- 26.9.2016
EDB: {Objednavka(Osoba, Vec, Mnozstvo)}
Napíšte dotaz v relačnom kalkule, ktorý vráti osoby, ktoré si objednali práve 2 rôzne veci v akomkoľvek množstve
Cvičenia
-
EDB:
{Lubi(Kto, Koho)}
(ak KTO lubi KOHO, neznamená to, že KOHO ľúbi KTO).
- nájdite všetkých, čo ľúbia jožka
- všetkých, čo sú ľúbený
- všetkých, ktorí ľúbia iba jožka
- všetkých, ktorí ľúbia iba jožka alebo ferka
- všetkých, ktorých ľúbia všetky ich lásky
- všetkých, ktorých láska je neopätovaná (t.j. nikto koho ľúbia ich neľúbi späť)
-
EDB:
{Zamestnanec(Meno, Plat); Oddelenie(Nazov, MenoVeduceho); ZamestnanecVOddeleni(Meno, Nazov)}
- Nájdite dvojice [Meno, Plat] zamestnancov, ktorí sú vedúci
- Nájdite zamestnancov, ktorí sú vedúci aspoň 2 oddelení
- Nájdite všetkých zamestnancov, ktorí nie sú vedúci
- Nájdite zamestnancov, ktorí sú vedúci práve 2 oddelení
- Nájdite zamestnancov, ktorí majú vyšší plat ako ich šéfovia
- Nájdite zamestnancov s najvyšším platom v rámci ich oddelia
-
EDB:
{Objednávka(ID, Osoba, Vec, Mnozstvo), Kamarati(Osoba1, Osoba2)}
(ID objednávky je jednoznačný číselný identifikátor objednávky - číslo s každou ďalšou objednávkov rastie o 1 - neskoršie objednávky majú väčšie číslo)
- ľudí, čo si objednávajú len vo veľkom množstve
- dvojice [Vec1, Vec2], ktoré si objednali aspoň 2 ľudia
- osoba, ktorá po istom čase ostala verná len jednej veci (t.j. od nejakého času si objednáva len tú istú vec - aspoň 2x)
- osoby, ktoré si objednali aspoň 2 veci rovnaké ako ich nejaký kamarát
- osoby, ktoré si objednali len to, čo ich kamaráti (t.j. neexistuje vec, ktorú si objednali a žiaden ich kamarát si ju neobjednal)
- osoby, čo si objednali všetky veci iné ako ich kamaráti (t.j. žiaden kamarát si neobjednal ani jednu rovnakú vec)
- trojice [O, V, M] také, že osoba O si objednala vec V v najväčšom množstve M zo svojich kamarátov (t.j. žiaden kamarát si neobjednal v rámci jednej objednávky z danej veci viac)
-
EDB:
{Part(Name); Component(Item, Subitem, AttachmentType)}
- nájdite iba atomické súčiastky (súčiastky bez podsúčiastok)
- súčiastky (aj nie atomické), z ktorých sa skladá motor
- atomické súčiastky potrebné na stavbu motora
- komponenty, ktoré sa skladajú iba zo súčiastok, z ktorých sa skladá motor (t.j. čo všetko vieme postaviť, ak máme motor)
- súčiastky, ktoré sú priskrutkované k motoru alebo spojke
-
EDB:
{lubi(Pijan, Alkohol), capuje(Krcma, Alkohol),navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
- krčmy, kde sa čapuje pivo a nič iné
- krčmy, kde sa pije pivo a nič iné
- pijani, ktorí ľúbia len rum
- pijani, ktorí ľúbia práve jeden alkohol
- pijani-štamgasti, ktorí doteraz navštívili jedinú krčmu
- pijani, ktorí niekedy niekde vypili viac ako pol litra jedného alkoholu
- pijani, ktorí nikdy neodolali rumu (pili ho pri každej návšteve krčmy, v ktorej ho čapujú)
- pijani, ktorí ľúbia aspoň jeden taký alkohol, ktorý čapuje každá krčma, v ktorej ten pijan niečo vypil
- pijani, ktorí pri niektorej svojej návšteve krčmy vytvorili doteraz platný rekord v pití vodky v danej krčme
- pijanov, ktorí vypili len tie alkoholy, ktoré vypil pijan Felix (t.j. hľadaní pijani vypili nejakú neprázdnu podmnožinu alkoholov,
ktoré vypil pijan Felix; a okrem tých alkoholov nevypili žiadne iné)
- alkoholy, pre ktoré platí, že ak ten alkohol niektorý pijan niekedy vypil, tak ho ten pijan vypil pri každej svojej návšteve krčmy
(vo výsledku majú byť aj alkoholy, ktoré nikto nikdy nevypil)
- krčmy, pre ktoré platí: hľadanú krčmu nenavštívil žiaden pijan, ktorý ľúbi všetky alkoholy, ktoré tá krčma čapuje (predpokladajte, že každá krčma čapuje nejaký alkohol)
- všetkých takých pijanov, ktorí neľúbia pivo ani borovičku; a zároveň sa dôsledne vyhýbajú návštevám takým krčiem, v ktorých sa čapuje len pivo alebo borovička;
a zároveň nikdy pivo ani borovičku nevypili
- alkoholy, ktoré ľúbia len tí pijani, ktorí nikdy nenavštívili krčmu Wasa
- dvojice [P, K] také, že pijan P pri každej návšteve krčmy K vypil niektorý z alkoholov, ktoré ľúbi
(pri rôznych návštevách mohol vypiť rôzne obľúbené alkoholy, chceme len dvojice, kde P niekedy navštívil K)
- dvojice [P, A], ktoré hovoria, ktoré alkoholy A pijan P vypil pri každej svojej návšteve krčmy (abstinenti nemajú byť vo výsledku)
- dvojice [P, A] také, že pijan P ľúbi alkohol A, a zároveň každá krčma, v ktorej P vypil A, čapuje alkohol A lacnejšie než ktorákoľvek iná krčma, ktorá čapuje A
- dvojice [K, A] také, že krčma K čapuje alkohol A, a zároveň každý pijan, ktorý ľúbi alkohol A, ho vypil pri niektorej návšteve krčmy K
- dvojice [P, A] také, že pijan P ľúbi alkohol A a ešte také dva ďalšie (navzájom rôzne) alkoholy, že pri každej návšteve krčmy,
pri ktorej P vypil A, vypil aj niektorý z týchto dvoch ďalších alkoholov
- dvojice [A, K] také, že alkohol A čapovaný v krčme K vypil (pri aspoň jednej návšteve) každý pijan, ktorý K niekedy navštívil
- dvojice [P, A] také, že pijan P ľúbi alkohol A; a v každej krčme, ktorá čapuje alkohol A, vypil P počas niektorej
návštevy viacej alkoholu A než ktorýkoľvek iný pijan počas jednej návštevy (teda P je rekordérom v pití A na jedno posedenie v každej krčme, ktorá A čapuje)
- pijanov, ktorí každý akt vypitia alkoholu urobili v jednej z krčiem, kde je ten alkohol najlacnejší (abstinenti nemajú byť vo výsledku)
-
EDB:
{Kurz(ID, Ucitel, Predmet); Navstevuje(Student, KurzID); Hodnotenie(Student, KurzID, Znamka);}
- Nájdite všetky dvojice [U, S], kde S je študent, ktorý má na všetkych kurzoch s učiteľom U len známky horšie ako 2, ale na všetkých ostatných kurzoch ma samé 1 (t.j. akoby si učitel U "zasadol" na študentovi S).
- Trojice [S, P, Z] také, že študent S má samé jednotky okrem predmetu P a Z je jeho známka z tohto predmetu.
- Dvojice [U, P] také, že učiteľ U z predmetu P neudelil hodnotenie horšie ako 2.
- Učiteľov U, ktorí učia 2 kurzy rovnakého predmetu a všetci študenti z jedného kurzku majú horšiu známku ako všetci študenti z druhého kurzu.
-
Agregácia:
EDB:
{lubi(Pijan, Alkohol), capuje(Krcma, Alkohol),navstivil(Id, Pijan, Krcma), vypil(Id, Alkohol, Mnozstvo)}
- pijani, ktorí ľúbia aspoň 10 rôznych alkoholov
- alkoholy, ktoré boli vypité v krčme Stein v celkovom množstve väčšom ako 20
- dvojice [A, Suma], ktoré popisujú množstvo alkoholu A vypitého v krčme Carlton (vo výsledku len tie, čo sa niekedy pili)
- dvojice [P, Pocet], ktoré hovoria, v koľkých krčmách prepil pijan P aspoň 10 EUR počas niektorej (jednej) návštevy
- trojice [P, A, Pocet], ktoré hovoria, pri koľkých návštevách pijan P vypil alkohol A (netreba nájsť trojice s počtom 0)
- pijani, ktorí sú v niektorej krčme lokálnymi šampiónmi v pití rumu (t.j. hľadaný pijan v aspoň jednej krčme vypil dokopy viacej rumu než ľubovoľný iný pijan)
- dvojice [P, Suma], ktoré hovoria, koľko peňazí pijan P celkovo prepil v krčmách, ktoré čapujú len alkoholy, ktoré P neľúbi (dvojice s nulovou sumou nemajú byť vo výsledku)
- [P, nK, nA], kde nK je počet rôznych krčiem, ktoré pijan P navštívil, a nA je počet rôznych alkoholov, ktoré pijan P vypil (nechceme trojice, kde nK=nA=0)
- [K, A, m], kde m je celkové množstvo alkoholu A vypitého v krčme K (chceme vo výsledku každú dvojicu K, A, kde K čapuje A)
- dvojice [K, A] také, že alkohol A sa v krčme K vypil v celkovom množstve väčšom ako 50
- trojice [P, K, Pocet], ktoré hovoria, pri koľkých návštevách pijan P vypil v krčme K aspoň 5 borovičiek na jedno posedenie (trojice s nulovým počtom nás nezaujímajú)
- dvojice [A, M] také, že M je mediánom ceny alkoholu A cez všetky krčmy, ktoré alkohol A čapujú
- dvojice [K, Suma], ktoré hovoria, koľko peňazí v krčme K celkovo prepili pijani, ktorí tú krčmu navštívili viac než stokrát (dvojice s nulovou sumou nemajú byť vo výsledku)
- trojice [P, K, Priemer] ktoré hovoria, koľko peňazí utratil pijan P v priemere pri jednej návšteve krčmy K (trojice s nulovým priemerom nemajú byť vo výsledku)
-
Funkčné závislosti
-
r(A,B,C,D,E,F,G,H); F = {AH→GE, AD→E, B→CEH, CD→F, DE→AB}
minimálne pokrytie, všetky kľúče, dekompozícia do 3NF
-
r(A,B,C,D,E); F = {A→BC, CD→E, B→D, E→A}
minimálne pokrytie, všetky kľúče, dekompozícia do 3NF
-
r(A,B,C,D,E, F); F = {AB→CDF, ACF→B, AE→B, CD→ABF, CE→D, CEF→ABD}
minimálne pokrytie, všetky kľúče, dekompozícia do 3NF
-
r(A,B,C), napíšte SQL dotaz, ktorý overí platnosť B→C
-
r(A,B,C,D,E,F,G,H); F = {BF→ACG, C→AE, AH→F, AF→H, BG→F, E→G, BCE→F, GH→AF, H→D}
minimálne pokrytie, všetky kľúče, dekompozícia do 3NF
-
r(A,B,C,D,E,F,G,H); F = {ABH→G, AC→E, AD→F, AF→BH, BG→CF, EF→AG, G→F, GH→AF, H→D}
minimálne pokrytie, všetky kľúče, dekompozícia do 3NF