UL/FRI/UNI-RI/OPB/Vaje
Iz E-študij, proste zakladnice študentskega znanja
Relacijski podatkovni model
Imamo relacije:
- STRANKA (#sid, ime, priimek, starost, naslov)
- IZPOSOJA (#sid, #did,, datum_izposoje, datum_vrnitve)
- DVD (#did, zanr, regija)
Z relacijskim računom izpiši imena, priimke in starosti vseh strank, ki so si kdajkoli izposodile dvd zanra komedija
Rešitev:
- { t(3) : (∃ u ∈ STRANKA; v ∈ IZPOSOJA; w ∈ DVD: t[1] = u[ime] ∧ t[2] = u[priimek] ∧ t[3] = u[starost] ∧ u[sid] = v[sid] ∧ v[did] = w[did] ∧ w[zanr] = 'Komedija')}
Z relacijsko algebro izpiši imena strank, ki si samo med 1.8.2004 in 31.8.2004 niso izposodile nobenega akcijskega filma
Rešitev:
- πime(STRANKA) - πime(σ1.8.2004 < datum_izposoje < 31.8.2004 (STRANKA [X] IZPOSOJA [X] DVD))
Z jezikom SQL izpiši id, imena, priimke strank in število filmov, ki si jih je stranka kdajkoli izposodila. Izpis naj izgleda takole:
SID | IME | PRIIMEK | STEVILO FILMOV
Rešitev:
SELECT s.sid AS 'SID', s.ime AS 'IME', s.priimek AS 'PRIIMEK', COUNT(i.did) AS 'STEVILO FILMOV' FROM
`STRANKA` s, `IZPOSOJA` i WHERE s.sid = i.sid GROUP BY sid, ime, priimek
Imamo relacije:
- Stranka(sid, ime, priimek, naslov, ...)
- Prodajalec(pid, ime, priime, naslov, ...)
- GSM(gid, naziv, oznaka, tip)
- Kupcija(sid, pid, gid, kolicina, cena)
Z relacijskim računom izpiši imena in priimke strank, ki so kdajkoli kupile aparat tipa NOKIA ali SONY (v relaciji so samo stranke, ki so sploh kdaj kaj kupile).
Rešitev:
- { t(2) : (∃ u ∈ Stranka; v ∈ Kupcija; w ∈ GSM: t[1] = u[ime] ∧ t[2] = u[priimek] ∧ u[sid] = v[sid] ∧ v[gid] = w[gid] ∧ (w[tip] = 'NOKIA' ∨ w[tip] = 'SONY')) }
Z relacijsko algebro izpiši imena in priimke prodajalcev, ki so prodali samo telefone tipa NOKIA (v relaciji so lahko tudi prodajalci, ki niso še ničesar prodali).
Rešitev:
- πime((σtip = "NOKIA" (Prodajalec [X] Kupcija [X] GSM)) - πime(σtip <> "NOKIA" (Prodajalec [X] Kupcija [X] GSM))
Z jezikom SQL izpiši imena in povprečne cene prodanih GSM-jev. Izpis naj izgleda takole:
Ime_telefona | Povprecje
Rešitev:
SELECT g.tip AS 'Ime_telefona', COUNT(k.cena) / COUNT(k.kolicina) AS 'Povprecje' FROM
GSM g, Kupcija k WHERE g.gid = k.gid GROUP BY g.gid
Imamo relacije:
Kupec(ImeK, Kraj) Prodajalec(ImeP, Kraj) VrstaBlaga(ImeVB, Kvaliteta) Kupčija(ImeK, ImeP, ImeVB, Količina)
Z uporabo relacijskega računa in SQL stavkom poišči kupce iz Mežice, ki so pri prodajalcu iz Črne najkvalitetnejše blago, ki ga le-ta premore.
Rešitev:
Relacijski račun:
- { t(2) : (∃ u ∈ Kupec; v ∈ Prodajalec; w ∈ VrstaBlaga; z ∈ Kupčija: t[1] = u[ImeK] ∧ t[2] = u[Kraj] ∧ u[ImeK] = z[ImeK] ∧ v[ImeP] = z[ImeP] ∧ w[ImeVB] = z[ImeVB] ∧ u[Kraj] = 'Mežica' ∧ v[Kraj] = 'Črna' ∧ ¬(∃ x ∈ Kupcija; y ∈ VrstaBlaga: v[ImeP] = x[ImeP] ∧ y[ImeVB] = x[ImeVB] ∧ y[Kvaliteta] > w[Kvaliteta]))}
SQL stavek:
SELECT k.* FROM Kupec k, Prodajalec p, VrstaBlaga vb, Kupcija u WHERE
k.ImeK = u.ImeK AND p.ImeP = u.ImeP AND vb.ImeVB = u.ImeVB AND
k.Kraj = 'Mežica' AND p.Kraj = 'Črna' AND vb.Kvaliteta >= ALL
(SELECT y.Kvaliteta FROM Kupcija x, VrstaBlaga y WHERE x.ImeP = p.ImeP AND x.ImeVB = y.ImeVB)
Imamo relacijo Dela(Oseba, Projekt). Poišči osebe, ki sodelujejo najmanj pri vseh tistih projektih, pri katerih sodeluje Miha.Rešitev napiši v relacijski algebri, relacijskem računu in s stavkom SQL.
Rešitev:
Relacijska algebra:
- Dela / πProjekt(σOseba = 'Miha' (Dela))
Relacijski račun:
- { t(1) : ∀ v ∈ Dela: ( ¬ (v[Oseba] = 'Miha') ∨ (∃ u ∈ Dela: u[Projekt] = v[Projekt] ∧ u[Oseba] = t[1])) }
SQL stavek:
SELECT d1.Oseba FROM Dela d1 WHERE NOT EXISTS (
(SELECT d2.Projekt FROM Dela d2 WHERE d2.Oseba = 'Miha') MINUS
(SELECT d3.Projekt FROM Dela d3 WHERE d3.Oseba = d1.Oseba))
Sočasna uporaba podatkovne baze
Napiši razpored, po katerem se izvedeta transakciji T1 in T2 pod nadzorom protokola PSC in dodatnega protokola rani ali čakaj, če bi se njuni ukazi izvajali izmenoma (najprej ukaz T1, nato ukaz T2, pa spet T1 ...). Transakcijo T1 sproži klic programa Odštej(X, Y), transakcijo T2 pa klic Odštej(Y, X), kjer sta X in Y naslova zapisov v podatkovni bazi.
Program Odštej(A, B) je sestavljen iz naslednjih ukazov:
D-PoiščiPreberi(A, a) D-PoiščiPreberi(B, b) a := a - b E-Ažuriraj(A, a) Pomni
Rešitev:
| T1 | T2 |
|---|---|
| D-PP(X, a) (deljeno zasežemo X) | |
| D-PP(Y, a) (deljeno zasežemo Y) | |
| D-PP(Y, b) (deljeno zasežemo Y) | |
| D-PP(X, b) (deljeno zasežemo X) | |
| a := a - b | |
| a := a - b | |
| E-A(X, a) (po prekiitvi T2 se ekskluzivno zaseže X) | (zaradi protokola 'rani ali čakaj') se transakcija prekine in vrne ponovno v izvajanje |
| D-PP(Y, a) (deljeno zasežemo Y) | |
| Pomni (sprostijo se zaseženja transakcije T1) | |
| D-PP(X, b) (deljeno zasežemo X) a := a - b E-A(Y, a) (ekskluzivno zasežemo Y) Pomni (sprostijo se zaseženja transakcije T2) |
Napiši razpored, po katerem se izvedeta transakciji T1 in T2 pod nadzorom protokola, ki temelji na časovnem označevanju. Ukazi transakcij se izvajajo izmenoma (najprej ukaz T1, nato ukaz T2, pa spet T1 ...). Transakcijo T1 sproži klic programa Zmnoži(X, Y), transakcijo T2 pa klic Zmnoži(Y, X), kjer sta X in Y naslova zapisov v podatkovni bazi. Kaj bi se zgodilo, če nebi uporabljali tega protokola?
Program Zmnoži(A, B) je sestavljen iz naslednjih ukazov:
D-PoiščiPreberi(A, a) D-PoiščiPreberi(B, b) a := a * b Ažuriraj(A, a) Pomni
Rešitev: