Nejste přihlášen/a.
Ahoj, připravuji se na maturitu a jsem zrovna u této otázky:
Zadání: Vytvořte relační databázi pod názvem "Škola", která bude obsahovat následující tabulky: učitelé, žáci, výukové předměty. Datové struktury a datové typy jednotlivých tabulek zvolte dle uvážení. Relace mezi jednotlivými tabulkami volte dle přirozených vazeb. Omezení: vytvořte pouze datové struktury.
Mám několik otázek:
To, že mám vytvořit pouze datové struktury znamená, že nemám vkládat žádná data? Já bych si to totiž u maturity chtěla vyzkoušet, že běží vše jak má - a to jinak než zadáním testovacích dat asi nepůjde.
Dále bych se chtěla zeptat, jak mám tu tabulku udělat? Vůbec nevím jak na to. Vytvořila jsem 3 tabulky podle zadání. Do tabulky učitelé a žáci jsem dala ID (aut. číslo), příjmení, jméno a předmět(y) (text), do tabulky předměty jsem dala jen ID a název předmětu.
Jak mám teď ty tabulky pomoci relací spojit? Asi by to bylo nejlepší tak, že kdybych otevřela tabulku žáci, bylo by tam napsané, jaké předměty studuje ten daný žák a zároveň u tabulky učitelé by byly názvy všech předmětů, které vyučují. Nevím však, jak to zpracovat - těch předmětů může být na jednoho žáka i učitele víc... a třeba v tabulce předměty bych chtěla vytvořit ještě jedno pole: Učitelé, které by zobrazovalo, kteří učitelé daný předmět vyučují.
Budu moc ráda když mi pomůžete a dovedeme to do zdárného konce.
Pracuji v MS Access 2003
Děkuju :*
Žádná N:N nesmí existovat, všechny takové je třeba převést na 1:N a následně N:1.
Tabulek tedy vznikne pět: 1. učitelé, 2. žáci, 3. předměty, 4. vyučující daného předmětu (tj vazba učitel-předmět) a 5. studenti daného předmětu (tj žák - předmět). Vycházím přitom z předpokladu, že jeden předmět může studovat více žáků a každý žák může studovat více předmětů - to je tak nějak automatické. Zároveň teda předpokládám, že učitel může vyučovat více předmětů a že předmět také může být vyučován vícero různými učiteli - pokud by tohle neplatilo, pak by odpadla tabulka 4 a každý předmět by ukazoval přímo na jednoho svého učitele.
Jestli jste měli taky nějakou teorii, tak jde v podstatě o redukci na třetí normálovou formu, když začnete tím, že bude úúúplně všechno nacpané do jedné velké tabulky "každý s každým", tak se ke správnému řešení dostanete, akorát to trochu potrvá
Pak bych oproti Mowlovi z jeho posledního příspěvku upřednostňoval možnost B, raději duplikovat řádky a doplňovat k nim ID z druhé tabulky, než vytvářet složenou hodnotu s oddělovači apod.
Výhody:
vázat to půjde pořád stejně, tj bez stringových operací, vybírání podčástí řetězce a podobně;
jako primární klíč se zvolí buď číslo řádku (a tedy PK nebude odpovídat žádné reálné skutečnosti, jako třeba evidenčnímu číslu studenta), nebo více sloupců (jméno+příjmení+předmět - toto ovšem odporuje těm normalizačním pravidlům, která ale tak jako tak nesplníte, když nesmíte mít tabulky navíc);
všechny ostatní operace půjdou provádět stejně jako vždy, jen bude třeba výsledky seskupit (agregační funkce group by), aby z toho vypadli jen unikátní studenti;
masivní nevýhoda možnosti A, která u této možnosti B nenastane: když budu chtít vypsat žáky, kteří studují daný předmět, nedejbože pak vyjet všechny předměty a seznam zapsaných žáků do každého z nich, budu muset dělat stringové porovnání nebo vyhledání podstringu po jednotlivých řádcích, kteroužto operaci nebude databáze nijak optimalizovat - jinak řečeno to bude pomalé jak lemra.
Vlastně ten první bod je tak velkou výhodou, že jen kvůli němu samému bych to udělal takhle a ne naopak. Vazba na číslo, které je primárním klíčem nebo indexem, je x-krát rychlejší, než vazba na část textového řetězce (no a taky pohodlnější).
Nevýhody:
nepůjde na první pohled odlišit, jestli žák studuje jeden nebo žádný předmět - v obou případech bude mít jeden záznam;
sumy a počty budou muset být taky doplněny nějakou podmínkou navíc, což bude brzdit;
group by bude ve větším množství záznamů oproti prostému selectu všech řádků znatelně pomalejší.
---
No ale jestli to máte jen k maturitě a s tím omezením, jak píšete, pak bude asi jakékoli správné řešení dostačujícím.
Učitelé by měla být jedna tabulka, Žáci druhá a Předměty třetí, předměty budou - v podstatě, číselníkem...
Pak - např. relace Žáci-Předměty - buď budeš mít v tabulce Žáci řádek pro každý předmět (v poli Studuje bude vždy právě jeden záznam), který žák studuje a nebo pole Studuje vytvoříš ´kumulované´ a bude obsahovat všechny žákem studované předměty.
Nejjednodušší bude, když si možné relace (vztahy) jednotlivých tabulek nakreslíš a vazby popíšeš (1:N - např.)
A - pokud máš vytvořit jen datovou strukturu, stačí ti create table... , popis a primární klíč a setřídění (příp. indexy).
Ahoj,
děkuju za odpověď.
Já jsem to právě chtěla Kumulovaně - prostě a jednoduše, chci to vytvořit tak, že např. v tabulce žáci bude kolonka Předměty - a tam bude výpis jednotlivých předmětů. Ale nějak si to nedokážu představit - můžu tam napsat jen jednu hodnotu (jedno ID z tabulky předměty) a nevím, jak napsat např. 1,3,4 (což by v mém případě znamenalo Matematika, Angličtina, Němčina).
Už si bohužel moc dobře nevzpomínám, jak jsme to dělali, ale vím, že když to bylo správně udělané, tak MS Access sám ukazoval přímo názvy těch předmětů když se na to najelo.
Problém je v tom, že ke každému předmětu může být např. více učitelů a ke každému učiteli může být více předmětů - to je N:N a s tím mám jak vidno velké problémy, jelikož si to nedokážu vůbec představit. Chybí mi praxe a snažím se to teď dohnat.
S MS Access moc nedělám, ale aby "MS Access sám ukazoval přímo názvy těch předmětů když se na to najelo" muselo by se (aspoň se domnívám) jednat už o aplikaci (formulář), nikoli ´holou´ DB.
pole Předměty
- pokud jej budeš mít kumulativní, pak vol varchar (proměnnou délku znakové proměnné) a jednotlivé hodnoty budeš muset vybírat přes řetězcové funkce (string)
- já bych k tabulce Žáci (pole např. ID, Jméno, Příjmení, Datum narození, Třída, Poznámka) přidal tabulku Žáci-Předměty (IDzaka, IDpredmetu), vazba mezi nimi 1:N (a k tomu přidal číselník Předměty - IDpredmetu, Popis) - s tím, že všechna ID by vždy byla Integer (nemusel bych se ´patlat´ s řetězci)
OK - pokud nesmíte vytvářet více tabulek, pak musíš ´chybějící´ tabulky ´nahradit´ (A je, podle mne, lepší):
A) - kumulovat hodnoty studovaných předmětů v poli Předmět (u Žáků i Učitelů) a pracovat s nimi pomocí řetězcových operací (zvol vhodný oddělovač nebo - asi lépe, pevnou délku hodnoty proměnné)
B) - nebo duplikovat řádky jednotlivých žáků i učitelů (kolik studovaných předmětů, tolik řádků) a tím jednak výrazně vzroste množství uložených dat a hlavně přestane být ID žáka (učitele) jedinečné pro řádek - musíš klíč doplnit např. pořadovým číslem řádku
Dzordzi - variantu A považuju za lepší v tomto konkrétním případě, kdy jde řádově o desítky žáků a jednotky učitelů i předmětů...
Neneseme odpovědnost za správnost informací a za škodu vzniklou jejich využitím. Jednotlivé odpovědi vyjadřují názory jejich autorů a nemusí se shodovat s názorem provozovatele poradny Poradte.cz.
Používáním poradny vyjadřujete souhlas s personifikovanou reklamou, která pomáhá financovat tento server, děkujeme.