Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 17. 03. 2013 11:09

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Relační kalkul a algebra

Zdravím,

prosím, potřebovala bych poradit s úkolem. Máme databázi:

Pacient(RČ, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Lékař(IČO, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Návštěva(RČ, IČO, datum návštěvy, diagnoza, datum kontroly)

A máme přepsat následující dotazy do n-ticového relačního kalkulu a algebry:

1. Všechny lékaře a pacienty, kteří bydlí ve stejném městě.
2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.
3. Kdy má přijít na kontrolu pacient “Novák”.
4. Kolik ošetření provedl dne “30.11.2000” lékař “Král”.
5. Pacienty, kteří byli na návštěvě pouze u lékaře “Krále”.
6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.

Jediné co mám, tak je 5. :

x.RČ WHERE Návštěva(x) AND Lékař.přijímení = ´Král´

Co znamená to x?

Děkuji moc

Offline

 

#2 19. 03. 2013 23:11

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

↑ Ilhvm:

síce netuším, čo je x ale tá 5-ka sa mi nepozdáva tak, či tak

zapíšem dotaz č. 5 v SQL zápise:

Code:

SELECT p.jmeno, p.prijmeni, p.rc
FROM pacient p
JOIN navsteva n
ON p.rc = n.rc
JOIN lekar l
ON n.ico = l.ico
WHERE l.prijmeni = 'Kral'

MINUS

SELECT p.jmeno, p.prijmeni, p.rc
FROM pacient p
JOIN navsteva n
ON p.rc = n.rc
JOIN lekar l
ON n.ico = l.ico
WHERE l.prijmeni <> 'Kral'

V zadaní sa píše pouze u Krále - a to "pouze" zásadne mení situáciu.
Preto by malo ísť o 2 množiny dát. V prvej sa vytvorí spojenie cez všetky tabuľky a vyberú sa iba pacienti, ktorí boli u "Krále".
Druhá množina je to isté spojenie, ale podmienka je opačná, teda pacienti ktorí boli u nejakého iného lekára.
Ich rozdiel sú pacienti, ktorí boli u "Krále" ale neboli u iného lekára.

SQL zápisom som chcel ukázať, že toho obsahuje viac než ten zápis s "x". A iba pomocou WHERE a AND sa tento dotaz nedá správne realizovať.
"x" by mohol byť asi nejaký pokus zapísať JOIN operáciu, ktorá tam je určite nevyhnutná.

Offline

 

#3 20. 03. 2013 07:44

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Re: Relační kalkul a algebra

↑ etchie:
Děkuju.
Mě spíše jde o tu relační algebru a kalkul, studuji dálkově, takže nemám moc možností jak to pochopit a ze skript mi to prostě nedává smysl někdy.

Např.:

Mějme relace:
KINO(NÁZEV_K, ADRESA)
FILM(JMÉNO_F, HEREC, ROK)
PROGRAM(NÁZEV_K, JMÉNO_F, DATUM)

Zapište v relační algebře dotaz: Najděte název kina a jeho adresu, kde dávají film Kolja.

Řešení:
(PROGRAM(JMÉNO_F = 'Kolja‘ [NÁZEV_K = NÁZEV_K])
[NÁZEV_K=NÁZEV_K] KINO [NÁZEV_K,ADRESA]

Zdá se mi to složitě sepsané, takže teď nevím, jestli to tak fakt má být a nebo to tak složitě píše vyučující (ještě k tomu tam někde chybí závorka).
Proč se tam 2x porovnává NÁZEV_K?

Offline

 

#4 20. 03. 2013 10:34

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

↑ Ilhvm:

Ja sa tiež práve učím relačnú algebru, ale SQL zápis mi je oveľa bližší.
Tomu zápisu RA, ako ho uvádzaš, nerozumiem veľmi dobre. My sa učíme relačnú algebru zapisovať inak.

Ak to popíšem slovami, tak by to bolo: spoj KINO a PROGRAM na základe poľa NÁZEV_K tj. výraz [NÁZEV_K = NÁZEV_K] z tejto množiny vyber záznamy kde film je 'Kolja' tj. podmienka JMÉNO_F = 'Kolja'.
Z toho, čo ostane už iba vyber stĺpce [NÁZEV_K, ADRESA].

Takže tiež nerozumiem prečo tam je 2x [NÁZEV_K = NÁZEV_K]

Offline

 

#5 20. 03. 2013 10:47

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Re: Relační kalkul a algebra

↑ etchie:
A nemáš nějaké zápisky nebo tak? Potřebuju něco, kde je to vysvětleno trošku srozumitelněji, než to máme my. Hlavně teda potřebuju vědět, co tam mohu použít, co psát do závorek a jak to prostě tvořit.

Offline

 

#6 20. 03. 2013 18:13 — Editoval etchie (20. 03. 2013 18:35)

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

↑ Ilhvm:

Ja som zvyknutý na toto Relační algebra alebo Relačná algebra

Ale našiel som v nejakých zdrojoch aj tieto zápisy:
projekcia: R[C] kde C sú atribúty teda stĺpce, ktoré sa vyberajú
selekcia: R(C) kde C je podmienka, podľa ktorej sa vyberá
spojenie: R * S
rozdiel: R - S

Je tam aj príklad, ktorý sa dosť podobá na ten tvoj.
Vypíšte zoznam kín, kde nedávajú žiadny film s hercom Marlon Brando.

Code:

KINO[NAZOV_K] - (FILM(HEREC=Brando)[MENO_F] * PROGRAM[NAZOV_K, MENO_F]) [NAZOV_K]

číta sa to takto:

1. KINO[NAZOV_K] vyber z tabuľky KINO všetky názvy kín a odlož si ich na neskôr - robí sa tu projekcia

2. FILM(HEREC=Brando)[MENO_F] vyber z tabuľky FILM všetky filmy kde hrá Brando a vyber iba názov filmu - robí sa tu selekcia a projekcia

3. PROGRAM[NAZOV_K, MENO_F] z tabuľky PROGRAM vyber 2 stĺpce - iba projekcia

4. to čo ti vyšlo z bodu 2 a z bodu 3 spoj dokopy teda: FILM(HEREC=Brando)[MENO_F] * PROGRAM[NAZOV_K, MENO_F] - ide o spojenie

5. z množiny, ktorá vznikla v bode 4 vyber iba stĺpec [NAZOV_K] - robí sa tu projekcia

6. z množiny, ktorú sme odložili v bode 1 odpočítaj všetky prvky ktoré obsahuje množina z bodu 5 - robí sa rozdiel množín

To čo ostalo sú kiná, kde Brando nehrá v žiadnom filme.

Offline

 

#7 20. 03. 2013 18:37

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Re: Relační kalkul a algebra

↑ etchie:
Super, děkuju.

No, tak nějak jsem přišla na ten druhý příklad nahoře, kdy hledáme pacienty, kteří nebyli na žádné návštěvě, s tím zbytkem si nevím rady, šlo by to nějak takto?

pacient[jmeno, prijmeni](Navsteva(datum_navstevy = " "))

Offline

 

#8 20. 03. 2013 20:32 — Editoval etchie (20. 03. 2013 20:34)

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

↑ Ilhvm:

2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.

Tento dotaz sa realizuje takzvaným ľavým vonkajším spojením - LEFT OUTER JOIN
V zdrojoch, z ktorých som uvádzal zápis sa o tom síce hovorí, ale vôbec tam nie je napísané ako sa to označuje.
Musím teda zaviesť nejaké vlastné značenie, lebo neviem nikde nájsť ako to označiť.
Takže: nech *L je ľavé vonkajšie spojenie. (*R by bolo pravé a *F by bol FULL OUTER JOIN)

Code:

(Pacient *L Navsteva) (datum_navstevy IS NULL) [RC, Jmeno, Prijmeni]

Tento dotaz musí byť realizovaný ako ľavé vonkajšie spojenie pretože, tí pacienti čo ešte neboli na žiadnej návšteve, nemajú v relácii Návšteva žiadne záznamy. Operácia *L im napriek tomu takéto záznamy dotiahne a ich hodnoty budú všade NULL.
Vzhľadom na hodnoty NULL dosadené pre neexistujúce záznamy je aj tento zápis ekvivalentný:

Code:

(Pacient *L Navsteva) (ICO IS NULL) [RC, Jmeno, Prijmeni]

to znamená že nie len, že deň návštevy neexistuje, ale ani lekár, ktorý vyšetril pacienta.

Offline

 

#9 20. 03. 2013 21:07

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.

obtiažnosť tejto úlohy je úplne že "no ty vole !".
Mne z toho vychádza, že je potrebné definovať označenie pre ďalšiu operáciu tzv. CROSS JOIN. To je vlastne karteziánsky súčin a tu by sa celkom hodilo to X z úvodu témy. Nech teda R X S je karteziánsky súčin relácií R a S.

A mne z toho teraz vychádza takáto šialenosť:

Code:

Pacient[RC, Jmeno, Prijmeni] - 
( (Pacient X Lekar) [ICO, RC, Jmeno, Prijmeni] - (Pacient * Navsteva) [ICO, RC, Jmeno, Prijmeni] )[RC, Jmeno, Prijmeni]

Offline

 

#10 21. 03. 2013 09:05

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Re: Relační kalkul a algebra

↑ etchie:
Doobře, já ti moc děkuju :) Našla jsem každopádně ten můj úkol vyřešen, takže problém vyřešen :))

Offline

 

#11 21. 03. 2013 16:58

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Relační kalkul a algebra

↑ Ilhvm:

Tak to je fajn.
Môžeš dať aj sem riešenie, nech sa aj my ostatní dozvieme, ako to má byť.
Zaujíma ma aj ako sú označené tie operácie a či to aj sám dobre chápem.

Vďaka

Offline

 

#12 21. 03. 2013 17:22

Ilhvm
Místo: Ostrava
Příspěvky: 80
Reputace:   
 

Re: Relační kalkul a algebra

↑ etchie:
No je to takové nějaké složité, sama bych na to určitě nepřišla.

Pacient(RČ, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Lékař(IČO, jméno, příjmení, ulice, číslo, PSČ, město, telefon)
Návštěva(RČ, IČO, datum návštěvy, diagnoza, datum kontroly)

RELAČNÍ ALGEBRA
1. Všechny lékaře a pacienty, kteří bydlí ve stejném městě.
Join Lékař and Pacient where město_l = město_p

2. Pacienty, kteří ještě nebyli na žádné návštěvě u lékaře.
Project (Join (Minus (Project Pacient over RČ) and (Project Návštěva over RČ)) and Pacient where RČ = RČ ) over jméno_p, příjmení_p, RČ

3. Kdy má přijít na kontrolu pacient “Novák”.
Project (Join (Restrict Pacient where příjmení_p =„Novák“) and Návštěva where RČ = RČ) over jméno_p, příjmení_p, RČ, datum_kontroly

4. Kolik ošetření provedl dne “30.11.2000” lékař “Král”.
Project (Restrict (Join (Restrict Návštěva where datum_návštěvy=“30.11.2000”) and Lékař where IČO = IČO) where příjmení_l = “Král“) over count(RČ)

5. Pacienty, kteří byli na návštěvě pouze u lékaře “Krále”.
Project (Join Pacient and (Minus (Join Návštěva and (Restrict Lékař where příjmení_l=„Král“) where IČO=IČO) and (Join Návštěva and (Restrict Lékař where příjmení_l<>„Král“) where IČO=IČO)) where RČ=RČ) over jméno_p, příjmení_p, RČ

6. Pacienty, kteří byli na návštěvě u všech evidovaných lékařů.
Project (Join (Devide (Project Návštěva over IČO, RČ) by (Project Lékaři over IČO)) and Pacient where RČ = RČ) over jméno_p, příjmení_p, RČ

Offline

 

#13 10. 05. 2013 01:20

Sep
Příspěvky: 35
Reputace:   
 

Re: Relační kalkul a algebra

Ahojte,

neporadili byste, jak napsat v jednoduchem prepisovacim jazyku dotazy, ktere po vyhodnoceni daji ty same informace?

Dekuji

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson