Ask Your Question
2

Relacna algebra

asked 2014-11-01 17:12:02 +0100

cheeseburger gravatar image

Ahojte, precvicujem si relacnu algebru a dopracoval som sa k dvom veciam, ktore mi niesu uplne jasne. image description

1.)Zoznam vsetkych lekarov, ktori prisli do styku s pacientami u ktorych bola urcena diagnoza HIV+. /chceme varovat napriklad zubarov, ktori mali takeho rizikoveho pacienta na kresle/

Spravne riesenie: { { NAVSTEVA (DIAGNOZA ="HIV+" ) [RODNE_C_P]} * NAVSTEVA } *> LEKAR cize vyberiem rodne cisla vsetkych, ktori maju hiv+ a potom to "vynasobim" s navstevou preto, lebo mam len rodne cisla nakazenych, a chcem aj C_LICENCE, DATUM, TYP etc., chapem tomu spravne? Nasledne sa to "porovna" s LEKARom konkretne asi s C_LICENCE a z toho mi vyhodi zoznam doktorov, ktori prisli do styku s hiv. No niesom si isty, ci to tak je aj v skutocnosti.

2.) Zoznam lekarov, ktori osetrili samich seba.

Spravne riesenie NAVSTEVA [RODNE_C_P = RODNE_C_L AND C_LICENCE = C_LICENCE > LEKAR tu mi nie je jasne, ako mozem porovnavat RODNCE_C_P s RODNE_C_L, kedze v relacii navsteva je len r.c. pacienta. Nevadi to, ze r.c. lekara je v inej relacii? Pri inych ulohach, ked som chcel pracovat s atributami z dvoch roznych relacii tak som to vacsinou musel * , no tu evidente asi nie. Vie mi niekto poradit preco?

Dakujem za odpovede.

edit retag flag offensive close delete

Comments

Je správné řešení tvoje řešení nebo je doopravdy správné?

beranm14 ( 2014-11-01 17:24:44 +0100 )edit

Je to uvadzane spravne riesenie z cvicebnice, takze malo by byt spravne :)

cheeseburger ( 2014-11-01 17:28:38 +0100 )edit

2 Answers

Sort by » oldest newest most voted
2

answered 2014-11-01 19:03:11 +0100

Josef Kokeš gravatar image

updated 2014-11-01 19:16:10 +0100

Úloha 1

  1. T1 = { NAVSTEVA (DIAGNOZA ="HIV+" ) [RODNE_C_P]} - Zjistíme seznam pacientů, u kterých byl diagnostikován HIV.
  2. T2 = { T1 * NAVSTEVA } - Teď zjistíme ID všech lékařů, u kterých dotyční pacienti někdy byli.
  3. T3 = T2 *> LEKAR - ID nás až tam moc netrápí, chceme na ty lékaře nějaký smysluplný kontakt, abychom je mohli varovat.

Kdybychom vynechali krok 2, tak sice dokážeme najít ID doktora a k němu dohledat podrobnosti, ale mělo by to tu drobnou chybku, že bychom našli jenom toho jednoho doktora, který HIV diagnostikoval. Dá se očekávat, že ten už nějaká opatření pro budoucí návštěvy udělal, takže varování nepotřebuje, ale ostatní doktoři o nebezpečnosti pacienta nic nevědí.

Úloha 2

IMHO to zadání není úplně v pořádku, protože není nikde explicitně zakotveno, jestli rodné číslo lékaře a rodné číslo pacienta pochází ze stejné množiny. Z logiky věci to dává smysl, ale podle mě to je zrovna skutečnost, která by měla být explicitně formulována.

Problém se vzorovým řešením je v tom, že to není dobře ozávorkované a identifikované, co patří k čemu. Já bych to zapsal spíš takhle: { { NAVSTEVA * LEKAR }(RODNE_C_P = RODNE_C_L) } [C_LICENCE, JMENO_L] (Ale pozor na to, že si nejsem tak úplně jistý, jaké přesně značení používáte na přednáškách. To moje má znamenat, že napřed spojím návštěvu a lékaře podle C_LICENCE, potom vyfiltruju jen ty záznamy, kde je RČ pacienta shodné s RČ lékaře a nakonec to osekám jen na ty pole, která jsou po mě požadována).

edit flag offensive delete publish link more

Comments

Dakujem velmi pekne :)

cheeseburger ( 2014-11-01 19:16:31 +0100 )edit
0

answered 2014-11-01 23:41:37 +0100

cheeseburger gravatar image

updated 2014-11-02 12:01:37 +0100

image description

Mohol by som este niekoho velmi pekne poprosit o kontrolu tychto uloh? V cvicebnici zial niesu k tymto uloham spravne odpovede :/

a.) {PREDMET * SEMESTER} (SEM_ID = "992")[PR_NAZEV] 

b.) PREDMET - {{{PREDMET * SEMESTER} (SEM_ID = "992")[PR_NAZEV]} * PREDMET }

c.) pri tomto si nie som velmi isty, zistim zoznam predmetov vyucujich sa v 992 - T1 = {PREDMET * SEMESTER} (SEM_ID = "992")[PR_ID] a z tychto predmetov by som teraz potreboval dostat len tie, ktore sa nikdy predtym neucili. Napadlo ma to riesit cez prienik, no neviem, ci by to takto mohlo byt spravne. T2 = {PREDMET * SEMESTER} (SEM_ID = "992")[PR_ID] prienik {PREDMET * SEMESTER}(SEM_ID <> "992")[PR_ID] tymto ziskam predmety ktore sa ucili v semestri 992 a zaroven v niektorom inom semestri. A nakoniec by som to odcital T3 = T2 - T1 , cim by som zrejme asi mal dostat len tie predmety, ktore sa ucili v 992.

d.) STUDENT - {{ZAPIS(SEM_ID = "992" )[ST_ID]}* STUDENT }

e.) A pri tomto som zas trochu strateny. Rozmyslal som nad nejakou takou variantou, ze by som vybral predmety, ktore sa ucia v 992, a od toho odcital studentov, ktori maju tento predmet. SEMPREDMET(SEM_ID = "992")[PR_ID] tymto ziskam zoznam predmetov, no zial dalej neviem, co s tym. Bol by niekto taky dobry a poradil mi? Dakujem vopred velmi pekne.

SPRAVNE RIESENIE

a) {SEMPREDMET * PREDMET}(SEM_ID = "992")[PR_NAZEV]

b) PREDMET - {{PREDMET*SEMPREDMET}(SEM_ID="992")[PR_NAZEV]}

c) {SEMPREDMET*PREDMET}(SEM_ID = "992")[PR_ID] - {SEMPREDMET*PREDMET}(SEM_ID != "992")[PR_ID]

d) STUDENT - {ZAPIS(SEM_ID = "992" )[ST_ID]}

e) SEMPREDMET(SEM_ID = "992") - ZAPIS(SEM_ID = "992")
edit flag offensive delete publish link more

Comments

Bylo by vhodné to mít jako samostatnou otázku.

V a) nelze použít PREDMET*SEMESTR, protože nemají nic společného. Udělalo by to obyčejný kartézský součin každý s každým. Je třeba vyjít z tabulky SEMPREDMET, která je propojuje.

V b) je to totéž, plus je podle mě zbytečné to koncové `* PREDMET`. Jestli to po vás chtějí, tak to ničemu nevadí, ale pokud je požadován pouze seznam ID předmětů, tak to není potřeba.

V c) by mělo stačit "předměty v semestru 992" (jako otázka a) mínus "předměty mimo semestr 992" (jako otázka a, ale s nerovná se místo rovná se). Jen se to bude brát z tabulku SEMPREDMET

V d) bych také nedával koncové `* STUDENT`

V e) je skoro stejná otázka jako v d), akorát se data berou odjinud. `SEMPREDMET(SEM_ID="992") - ZAPIS`

Josef Kokeš ( 2014-11-02 07:15:09 +0100 )edit

Ospravedlnujem sa, myslel som si, ze by bolo zbytocne zakladat dalsi topic. Tak ak by niekto chcel riesit cvicne tieto veci, prikladam uz snad aj spravne odpovede, ale pridavam ich do otazky, kedze v komente to nevie velmi odformatovat a je to neprehliadne. Malo by to tam byt hadam spravne, dakujem velmi pekne za ochotu :)

cheeseburger ( 2014-11-02 11:57:01 +0100 )edit

1) Tohle není Facebook. 2) Kdyby otázka byla složitější, tak není kam napsat odpověď: do mé předchozí odpovědi to nepatří a do komentářů se to nevejde.

Josef Kokeš ( 2014-11-02 14:34:24 +0100 )edit

Rozumiem, este raz sa ospravedlnujem a slubujem, ze sa polepsim :)

cheeseburger ( 2014-11-02 15:04:27 +0100 )edit

Your answer

Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

Add answer

[hide preview]

Question tools

Follow
1 follower

Stats

Asked: 2014-11-01 17:12:02 +0100

Seen: 170 times

Last updated: Nov 02 '14