Návrh systému rozvrhu pre FM TnU AD
1. | Popis systémov pre tvorbu rozvrhu |
2. | Návrh systému rozvrhu pre FM TnU AD |
3. | Administrátorské prostredie rozvrhu FM |
4. | Funkcie administrátorského prostredia
|
Obsah
Systémy pre tvorbu rozvrhu sa, tak ako väčšina aplikácií, v ktorých sú určené úlohy používateľov na základe rozličných stupňov oprávnení, delia na používateľskú a administrátorskú časť. Mojou úlohou bolo vytvoriť administrátorské prostredie aplikácie na správu rozvrhu pre potreby Fakulty mechatroniky TnUAD. Preto sa ďalej v práci budem zaoberať iba touto stránkou aplikácie a používateľské prostredie spomeniem iba v súvislosti s funkciami administrátorského prostredia. Aplikácia dostala názov rozvrhFM.
Použité programovacie prostriedky
Jednou z požiadaviek pri zadaní úlohy bolo, aby bola aplikácia online kvôli možnosti jednoducho pristupovať k nej z akéhokoľvek počítača. Rozhodol som sa preto vytvoriť klasickú internetovú aplikáciu pomocou jazykov HTML a JavaScript, na strane servera potom PHP, čo je v súčasnosti najpoužívanejší serverový skriptovací jazyk. Na ukladanie údajov používam databázu MySQL. Všetky akcie vykonané administrátorom sa prenášajú na server pomocou technológie AJAX, čo eliminuje potrebu opätovného načítavania stránky a zrýchľuje tak prácu s aplikáciou rovnako ako záťaž na server.
HTML
HTML[1] je značkový jazyk určený na vytváranie webových stránok a iných informácií zobraziteľných vo webovom prehliadači. HTML kladie dôraz skôr na prezentáciu informácií (odseky, fonty, váha písma, tabuľky atď.) ako na sémantiku (význam slov). Pôvodne bol určený ako veľmi zjednodušená podmnožina jazyka SGML, ktorý sa používa v organizáciách s komplexnými publikačnými požiadavkami, ale neskôr sa stal samostatným štandardom (ISO/IEC 15445:2000). Špecifikáciu jazyka HTML udržiava World Wide Web Consortium (W3C)[2].
Vo svojej aplikácií používam poslednú verziu, ktorou je HTML 4.01.
JavaScript
JavaScript[3] je skriptovací programovací jazyk používaný najmä pri tvorbe webových stránok. Pôvodne ho vyvíjal Brendan Eich zo spoločnosti Netscape Communications pod názvom Mocha, neskôr pod menom LiveScript. Pred uvedením na verejnosť bol premenovaný na JavaScript, najmä pre vtedajšiu popularitu jazyka Java.
Pre uľahčenie práce s JavaScriptom som sa rozhodol vo svojej aplikácií použiť knižnicu jQuery[4] a jej nadstavbu jQuery UI. jQuery je JavaScriptová knižnica, ktorá zjednocuje funkcie pre rôzne prehliadače, skracuje a zjednodušuje syntax, ponúka funkcie pre prácu s AJAXom a na animácie prvkov internetovej stránky. Jej nadstavba jQuery UI ďalej rozširuje tieto možnosti a ponúka kompletné riešenia najpoužívanejších užívateľských prvkov, napr.: dialógové okná, prepínacie záložky, kalendár, vysúvacie menu atď.
PHP
PHP[5] je populárny open source skriptovací programovací jazyk, ktorý sa používa najmä na programovanie klient-server aplikácií (na strane servera) a pre vývoj dynamických webových stránok.
Pre PHP taktiež existujú viaceré knižnice. Ja som si pre svoju aplikáciu vybral knižnicu Zend Framework vyvíjanú spoločnosťou Zend Technologies[6], ktorá sa taktiež podieľa na vývoji PHP. Ide o plne objektovo orientovanú knižnicu zjednodušujúcu mnohé úlohy od práce s databázou po integráciu so službami iných poskytovateľov, napríklad Google. Zend Framework podporuje a tiež odporúča oddelenie zobrazovania obsahu od vykonávania logiky programu, tzv. MVC (Model-View-Controller) model. Ďalej v práci budem používať niektoré výrazy z terminológie MVC:
- Model – časť aplikácie, ktorá definuje jej základnú funkcionalitu pomocou skupiny abstrakcií. Môžu v ňom byť definované rutiny prístupu k dátam a základná logika programu.
- View – presne definuje to, čo je prezentované používateľovi. Obyčajne kontrolér posúva dáta každému view, aby ich zobrazil v požadovanom formáte. View často zbiera údaje od používateľa. Sem sa vkladajú HTML značky.
- Controller (Kontrolér) – spája celý model dohromady. Narába s modelmi, rozhoduje, ktorý model sa má zobraziť, na základe požiadavky od používateľa a ostatných faktoroch, zbiera dáta, ktoré bude view potrebovať a posúva mu ich alebo predáva kontrolu inému kontroléru.
AJAX
AJAX[7] prakticky nie je programovací jazyk. Je to kombinácia asynchrónneho JavaScriptu a serverového skriptovacieho jazyka. Používa sa na vývoj interaktívnych webových aplikácií, ktoré menia obsah svojich stránok bez nutnosti ich opätovného načítania.
MySQL
MySQL[8] je slobodný a otvorený viacvláknový, viacužívateľský SQL relačný databázový server v súčasnosti vlastnený spoločnosťou Sun Microsystems. Je podporovaný na viacerých platformách a je implementovaný vo viacerých programovacích jazykoch ako PHP, C++ či Perl. Databázový systém je relačný typu DBMS. Každá databáza je v MySQL tvorená z jednej alebo z viacerých tabuliek, ktoré majú riadky a stĺpce. V riadkoch sa rozoznávajú jednotlivé záznamy, stĺpce udávajú dátový typ jednotlivých záznamov, pracuje sa s nimi ako s poľami. Práca s MySQL databázou je vykonávaná pomocou takzvaných dotazov, ktoré vychádzajú z programovacieho jazyka.
Návrh databázovej štruktúry systému rozvrhFM
Jednou z hlavných prípravných úloh pri vytváraní internetovej aplikácie je návrh databázovej štruktúry. Hlavne pri zložitejších aplikáciách, ktoré uchovávajú v databáze veľké množstvo dát, je návrh databázovej štruktúry kľúčovou otázkou. Správny návrh totižto môže uľahčiť vytváranie dotazov na databázu, zjednodušiť zdrojový kód aplikácie, zmenšiť miesto zaberané údajmi databázy na minimum a v neposlednom rade zmenšiť záťaž na server a tým zabezpečiť rýchly a bezchybný chod aplikácie.
MySQL podporuje pre ukladanie dát viacero úložných systémov, nap.: MyISAM, CSV, MEMORY, InnoDB, atď., ktoré sa líšia v ponúkanej funkcionalite a rýchlosti operácií. Pre našu aplikáciu som zvolil úložný systém InnoDB, ktorý je síce pomalší ako predvolený systém MyISAM, ale ponúka funkcionality ako sú transakcie a cudzie kľúče. Ďalšie informácie o databáze sú uvedené v tabuľke 2.1.
Verzia serveru: | 5.1.39-community |
Úložný systém: | InnoDB |
Znaková sada: | utf8_general_ci |
Aplikácia si bude potrebovať uchovávať informácie o študijných kombináciách, krúžkoch, predmetoch, miestnostiach a vyučujúcich, čomu by mala zodpovedať aj štruktúra tabuliek v databáze. Po dôkladnom zvážení všetkých požiadaviek aplikácie a možností databázy a po porade s konzultantom som sa rozhodol pre riešenie, ktoré je znázornené nižšie (Obr. 2.1). Pri pomenovávaní tabuliek a ich stĺpcov som sa riadil nasledujúcimi pravidlami:
- Všetky názvy sú v angličtine, dôvodom je programátorská konvencia
- Názvy tabuliek začínajú prefixom rozvrh_ - pre prípad, že by v jednej databáze muselo byť viacero tabuliek patriacich k rôznym aplikáciám
- Názvy tabuliek sú v nominatíve množného čísla, okrem tabuliek rozvrh_timetable a rozvrh_timetable_extern
- Každá tabuľka má primárny kľúč s názvom id, ktorý je autoinkrementujúci sa (v prvom riadku má hodnotu 1 a v každom ďalšom sa jeho hodnota zvýši o 1)
- Stĺpce, ktoré sú cudzími kľúčmi, majú názov ako tabuľka, na ktorú odkazujú v nominatíve jednotného čísla s postfixom _id. Hodnota týchto stĺpcov je totožná s hodnotou stĺpca id v riadku, na ktorý cudzí kľúč odkazuje
Jedinou výnimkou z pravidiel a) a b) je tabuľka eval_user, pretože sa plánovalo, že sa použije už existujúca tabuľka, ktorá sa používa v iných aplikáciách fakulty. Neskôr sa však ukázalo, že aplikácia bude bežať na inom servery, než sa nachádza existujúca tabuľka eval_users. Síce by sa dali používať v aplikácií údaje z tejto vzdialenej databázy, ale nebolo by tak možné plne využiť potenciál použitého úložného systému InnoDB, ktorý nedokáže vytvárať závislosti medzi tabuľkami z rozdielnych serverov. Rozhodol som sa teda vytvoriť kópiu tejto tabuľky v databáze našej aplikácie, ale kvôli nutnosti prepisovať už vytvorený kód som nepristúpil k premenovaniu tabuľky a cudzích kľúčov.
Nasleduje podrobný popis jednotlivých tabuliek a vzťahov medzi nimi.
Tabuľka rozvrh_restrictions
Obmedzenia vyučujúcich. Zoznam hodín, v ktoré vyučujúci nemôže učiť.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
week | ENUM('k','p','n') | týždeň obmedzenia pedagóga | k – každý p – párny n - nepárny |
day | INT(1) | číslo dňa | 1 – pondelok ... 6 - sobota |
hour | TINYINT(2) | časový slot 1 hodina | 8 - 20 |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
eval_user_id | eval_users | 1:n | nie |
Tabuľka eval_users
Kópia vybratých stĺpcov tabuľky použitej v systéme evalvácie fakulty. Táto tabuľka sa nachádza v inej databáze a na inom serveri. V tabuľke sú informácie o pedagógoch na FM.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
meno | VARCHAR(128) | krstné meno osoby | |
priezvisko | VARCHAR(128) | priezvisko osoby | |
tituly | VARCHAR(128) | zoznam titulov. Tituly sú oddelené čiarkou | |
VARCHAR(32) | email osoby |
Tabuľka rozvrh_teachers
Priradenie vyučujúceho k danému predmetu. K jednému predmetu môže byť priradených viacero vyučujúcich rovnako ako jeden vyučujúci môže byť priradený k viacerým predmetom. Táto tabuľka vznikla pri rozdelení vzťahu n:m medzi tabuľkami rozvrh_subjects a eval_users na dva vzťahy 1:n
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
is_lecturer | BOOL | je alebo nie je prednášajúci | 1 – je prednášajúci 0 – nie je prednášajúci |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
eval_user_id | eval_users | 1:n | nie |
rozvrh_subject_id | rozvrh_subjects | 1:n | nie |
Tabuľka rozvrh_userdetails
Doplňujúce informácie o zamestnancovi. Tieto informácie nie sú relevantné v systéme evalvácie FM, preto je vytvorená táto tabuľka.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
abbr | VARCHAR(20) | označenie vyučujúceho v rozvrhu, jedinečná hodnota | |
office | VARCHAR(10) | číslo dverí kancelárie zamestnanca |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
eval_user_id | eval_users | 1:n | nie |
Tabuľka rozvrh_combinations
Študijné kombinácie na FM.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
branch | VARCHAR(5) | skratka odboru | ME, MKP, MCMV |
branch_num | TINYINT(1) | číselné označenie odboru | 1 - 3 |
year | TINYINT(1) | ročník | 1 - 5 |
color | VARCHAR(7) | farebné označenie | #RRGGBB |
Tabuľka rozvrh_subjects
Zoznam predmetov. V tabuľke nie je informácia o type predmetu ani o dĺžke trvania predmetu.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
name | VARCHAR(255) | názov predmetu | |
abbr | VARCHAR(20) | skratka predmetu v rozvrhu | |
semester | ENUM('L', 'Z') | semester, v ktorom sa predmet vyučuje | L – letný Z - zimný |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
rozvrh_combination_id | rozvrh_combination | 1:n | nie |
Tabuľka rozvrh_subclasses
Zoznam krúžkov. Krúžky sú označené len dvojčíslom, ktoré tvorí poslednú časť názvu krúžku. Prvé tri číslice skutočného názvu krúžku predstavujú fakultu, zameranie a ročník.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
sign | VARCHAR(2) | označenie krúžkov | 01, 02 ... – denní študenti E – externí študenti |
note | VARCHAR(300) | poznámka |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
rozvrh_combination_id | rozvrh_combination | 1:n | nie |
Tabuľka rozvrh_subjecttypes
Typy vyučovacích hodín.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
name | VARCHAR(10) | slovné pomenovanie | prednáška, labák, cvičenie, konz. |
color | VARCHAR(7) | farba pri prezentácii rozvrhu | #XXXXXX |
Tabuľka rozvrh_subjectitems
Prepojovacia tabuľka, prepojuje predmet s typom predmetu a krúžkom
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
hours | TINYINT(1) | dĺžka vyučovacej hodiny | 1 - 9 |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
rozvrh_subject_id | rozvrh_subjects | 1:n | nie |
rozvrh_subjectType_id | rozvrh_subjecttype | 1:n | nie |
rozvrh_subclass_id | rozvrh_subclasses | 1:n | áno, ak majú všetky krúžky hodinu spoločne |
Tabuľka rozvrh_rooms
Zoznam učební a ich vlastnosti.
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
room | VARCHAR(10) | označenie učebne | |
capacity | TINYINT(2) | počet krúžkov, ktoré sa do učebne zmestia | 1 - 99 |
note | VARCHAR(255) | poznámka | |
type | ENUM('p','s','l') | p - prednášková s - seminárna l - laboratórium |
Tabuľka rozvrh_timetable
Jednotlivé položky rozvrhu, konkrétne predmety s priradeným časom výučby, vyučujúcim a miestnosťou - denné štúdium
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
provides | VARCHAR(8) | skratka katedry zabezpečujúcej predmet | |
week | ENUM('k','p','n') | týždeň konania výuky | k - každý p - párny n - nepárny |
day | TINYINT(1) | číslo dňa výuky | 1 - pondelok ... 5 - piatok |
hour | TINYINT(2) | začiatočná hodina výuky | 8 - 20 |
note | VARCHAR(255) | poznámka |
!názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
rozvrh_teacher_id | rozvrh_teachers | 1:1 | áno - vyučujúci zatiaľ nebol pridelený |
rozvrh_subjectItem_id | rozvrh_subjectitems | 1:1 | nie |
rozvrh_room_id | rozvrh_rooms | 1:n | nie |
Tabuľka rozvrh_timetable_extern
Jednotlivé položky rozvrhu, konkrétne predmety s priradeným časom výučby, vyučujúcim a miestnosťou - externé štúdium
názov | dátový typ | popis | možné hodnoty |
---|---|---|---|
provides | VARCHAR(8) | skratka katedry zabezpečujúcej predmet | |
week | DATE | týždeň (lepšie povedané deň) konania výuky | |
since | TIME | čas začiatku výučby | |
till | TIME | čas konca výučby | |
note | VARCHAR(255) | poznámka |
názov | referenčná tabuľka | vzťah | môže byť NULL |
---|---|---|---|
rozvrh_teacher_id | rozvrh_teachers | 1:1 | áno - vyučujúci zatiaľ nebol pridelený |
rozvrh_subject_id | rozvrh_subjects | 1:n | nie |
rozvrh_room_id | rozvrh_rooms | 1:n | nie |
rozvrh_subclass_id | rozvrh_subclasses | 1:n | nie |
Pohľady
Okrem spomínaných tabuliek som v databáze vytvoril dve pohľady (views) – rozvrh_view a rozvrh_view_extern. Pohľady sú virtuálne tabuľky - na rozdiel od normálnych tabuliek neobsahujú žiadne údaje, ale iba SQL dopyt, ktorý vyberá z jednej, ale častejšie viacerých tabuliek údaje a spája ich podľa zadaných kritérií. Používajú sa hlavne v prípadoch, že sú spolusúvisiace údaje rozdelené do viacerých tabuliek. Pri výbere z takýchto tabuliek je tvorba dopytov často veľmi komplikovaná, preto je jednoduchšie použiť pohľad. Ďalším prípadom, kedy je vhodné použiť pohľad namiesto prístupu k samotným tabuľkám je, keď viaceré aplikácie zdieľajú tú istú databázu a programátor chce zabrániť niektorým z nich v editácií údajov. Dáta v pohľadoch sú totiž read-only, tzn. určené len na čítanie. Nie je možné cez pohľad údaje do databázy pridávať, meniť ich alebo ich mazať. Na druhú stranu akákoľvek zmena v tabuľkách, z ktorých je pohľad vytvorený, sa okamžite prejaví aj v ňom.
Pohľady v našej databáze obsahujú všetky potrebné informácie o predmete, vyučujúcom, krúžku a čase a mieste konania výučby vo vytvorenom rozvrhu - rozvrh_view v rozvrhu pre denných študentov a rozvrh_view_extern pre externistov. Pohľady budú použité v tých častiach aplikácie, ktoré nepotrebujú práva na editáciu údajov v databáze, tzn. frontend, modul štatistík a exportov a všetky ostatné časti okrem administrátorského prostredia. Oddelenie údajov o rozvrhu pre denných a externých študentov, ako v pohľadoch, tak aj v samotných tabuľkách, bolo pritom nutné kvôli odlišnej relevancií informácií pre oba typy rozvrhov.
CREATE VIEW `rozvrh_view` AS SELECT
`s`.`name` AS `subject`, `s`.`abbr` AS `subject_abbr`, `s`.`id` AS `subject_id`, `si`.`hours` AS `hours`, `st`.`name` AS `type`, `st`.`color` AS `color`,
`tt`.`week` AS `week`, `tt`.`day` AS `day`, `tt`.`hour` AS `hour`, `r`.`room` AS `room`, `r`.`id` AS `room_id`, `tt`.`provides` AS `provides`,
`u`.`meno` AS `meno`, `u`.`priezvisko` AS `priezvisko`, `u`.`tituly` AS `tituly`, `u`.`katedra` AS `user_katedra`, `u`.`id` AS `user_id`,
`ud`.`abbr` AS `user_abbr`, `ud`.`office` AS `office`, concat('2',`c`.`branch_num`,`c`.`year`,`sc`.`sign`) AS `subclass`,
`si`.`rozvrh_subclass_id` AS `subclass_id`, `c`.`branch` AS `branch`, `c`.`branch_num` AS `branch_num`, `sc`.`sign` AS `subclass_sign`,
`c`.`year` AS `year`, `tt`.`note` AS `note`
FROM `rozvrh_timetable` `tt`
JOIN `rozvrh_subjectitems` `si` ON `tt`.`rozvrh_subjectItem_id` = `si`.`id`
LEFT JOIN `rozvrh_teachers` `t` ON `tt`.`rozvrh_teacher_id` = `t`.`id`
JOIN `eval_users` `u` ON `t`.`eval_user_id` = `u`.`id`
LEFT JOIN `rozvrh_userdetails` `ud` ON `u`.`id` = `ud`.`eval_user_id`
LEFT JOIN `rozvrh_subclasses` `sc` ON `si`.`rozvrh_subclass_id` = `sc`.`id`
JOIN `rozvrh_subjects` `s` ON `si`.`rozvrh_subject_id` = `s`.`id`
JOIN `rozvrh_combinations` `c` ON `s`.`rozvrh_combination_id` = `c`.`id`
JOIN `rozvrh_rooms` `r` ON `tt`.`rozvrh_room_id` = `r`.`id`
JOIN `rozvrh_subjecttypes` `st` ON `si`.`rozvrh_subjectType_id` = `st`.`id`;