Semestrální práce z předmětu Databázové systémy

Autor: Jan Skalický (skalij2)
cvičení X36DBS, čtvrtek 11:00
datum poslední aktualizace: 08.01.2006, 23:59

Prohlášení o autorství:
Zde předkládanou práci jsem vytvořil samostatně s využitím informačních zdrojů uvedených v závěru práce


Správa Železnice

  1. analytická část

    1. popis aplikace:

      Železnice je síť nádraží, tratí a vlaků realizující následující funkcionality:
      • evidence vlastních nádraží - stanic, jejich geografického umístění
      • evidence vozů - vagónů a lokomotiv, jejich domovských stanic a ostatních parametrů
      • sprava spojů - zastávky, řazení vagónů vlaku a jejich druh (osobní/nákladní), přiřazený strojvůdce (z množiny zaměstnanců) apod.
      • jízdní řád, který se odkazuje na identifikátory spojů, stanic a podporuje speciální dny (svátky, dny pracovního klidu...)
      • seznam zaměstnanců v rámci jednotlivých nádraží, jejich pracovišť (včetně skupin) a přidělených směn (pracovní doba na konkrétním pracovišti)
      • evidence oprávnění (strojních průkazu) strojvůdců k řízení různých typu (skupin) lokomotiv
      • prodej jízdenek a místenek včetně jejich asociace s vydávajícím pokladním, výdejnou, datem atd.
        cenu lístku je možné v klientské aplikaci kalkulovat prostřednictvím kilometrovníku (tabulka tras mezi stanicemi, která obsahuje i vzdálenost)
      • podpora ovládání traťových výhybek (uzel grafu železniční síťe se 3 hranami patřící ke konkrétnímu nádraží) interními pracovníky (výhybkáři)
      • podpora posunování vozů při zařazování vlaku (fyzicky vznikajícího spoje) interními pracovníky (posunovači)

      Základní entity modelu:

      Vůz/Vagón, Vůz/Lokomotiva, Spoj, Řazení, Pohon, Stanice, Zastávka, Pracovník, Pracovník/Strojvůdce, Pracovník/Posunovač, Pracovník/Obecný, Pracovník/Pokladní, Pracoviště, Zaměstnání, Směna, Jízdenka, Výhybka, Lokace, Trasa



    2. E-R schéma úložiště dat:

      sem patří obrázek s E-R modelem...

      E-R schéma v původní velikosti zde
      E-R schéma v XML formátu zde

    3. uživatelských role:

      název uživatelské role pracovní zařazení
      Správce databázevytváří a udržuje databázi v chodu, kontroluje stav a logickou konzistenci všech dat
      Správce infrastrukturypromítá do databáze síť železničních tratí, nádraží a její změny
      Správce vozového fondupromítá do databáze železniční vozy a změny jejich atributů
      Školitel strojvedoucíchuděluje strojvedoucím oprávnění k řízení typů lokomotiv
      Pracovník personálního oddělenípromítá do databáze přírůstky a úbytky v pracovním kolektivu
      Koordinátor činnosti nádražíobsazuje pracovníky na pracoviště a do směn, spravuje pracoviště
      Rozvrhář spojůnavrhuje a ruší železniční spoje, jejich řazení vozů a jízdní řád, který lze exportovat
      Strojvůdceřídí lokomotivu z množiny těch, na kterou vlastní řidičské oprávnění
      Posunovačposunuje vozy spoje a z rozebraných vozů vytváří nové podle příslušného řazení
      Výhybkářovládá některé výhybky související se stanicí jeho pracoviště; PPS*
      Pokladníprodává jízdenky a nezná průkazku typu ISIC; PPS*
      Vedoucí servisukontroluje stav vozů s domovskou stanicí jeho pracoviště a alokuje servisní techniky
      Servisní technikprovádí udržbu a opravy vozů; PPS*
      Výpravčívypravuje odchozí vlaky v rámci stanice jeho pracoviště; PPS*
      Hlasatel spojůovládá nádražní rozhlas domovské stanice; PPS*
      Uklízečkazametá prach; PPS*
      * pracuje v přidělené směně na přiděleném pracovišti

    4. scénáře uživatelských postupů:

      1. Správce databáze - zprovoznění databáze
        1. zprovoznění databázového stroje
        2. vytvoření struktury databáze pomocí skriptu vygenerovaného modelovacím programem
        3. naplnění databáze počátečními daty

      2. Správce databáze - správa uživatelských účtů
        1. založení/zrušení uživatelského účtu pro přistup do databáze
        2. nastavení přístupových práv pro uživatele databáze v závislosti na jeho roli

      3. Správce infrastruktury - aktualizace železničních tratí
        1. editace tabulky výhybek (relace Vyhybka) (např. upgrade výhybky z mechanické na automatickou), resp. zakládání/rušení řádků dle skutečnosti
        2. editace tabulky tras (relace Trasa) - výpočet nových vzdáleností a ostatních atributů tras dle změn v železniční infrastruktuře

      4. Správce infrastruktury - aktualizace nádraží
        1. editace tabulky nádraží (relace Stanice) (např. při elektrifikaci nádraží), resp. zakládání/rušení řádků dle skutečnosti
        2. pro založení nádraží na místě, jehož lokace není dosud v tabulce lokací je nutno vytvořit zde (v relaci Lokace) nový záznam a vyplnit jeho geografickou polohu, atribut osada je nepovinný a může nést název nejbližší osady
        3. v případě nově založeného nádraží je provedena aktualizace železničních tratí - přidání nových výhybek a nastavení jejich směrů podle grafu železniční sítě, update tras

        pozn.: při rušení nádraží nebo editaci/rušení směrů výhybek je nutný následný zásah Rozvrháře spojů, který provede aktualizaci zastávek těch spojů, které obsahovaly dotčené stanice v seznamu svých zastávek; analogicky pro trasy, pokud spoj stanicí pouze projížděl a neměl zde zastávku

      5. Správce vozového fondu - aktualizace typů registrovaných vozů
        1. v případě, kdy je potřeba registrovat vůz, jehož typ se odlišuje od všech zatím známých, je třeba vytvořit typ pro tento vůz dle jeho atributů v tabulkách typů vozů
        2. pokud se jedná o lokomotivu, bude se akce týkat relace Typ_lokomotiva a jejích vlastních atributů, analogicky pro vagón v relaci Typ_vagon

      6. Správce vozového fondu - aktualizace registrovaných vozů
        1. editace tabulek vozů (relace Vagon, Lokomotiva) (např. oprava data výroby), resp. zakládání/rušení řádků dle skutečnosti
        2. při zrušení poslednío vozu daného typu je možné odstranit tento z tabulkek typů vozů (relace Typ_lokomotiva, Typ_vagon)

        pozn.: při rušení vozu nebo editaci jeho parametrů je nutný následný zásah Rozvrháře spojů, který provede aktualizaci řazení spojů, které obsahovaly dotčené vozy ve svém řazení

      7. Školitel strojvedoucích - školení strojvedoucích
        1. vlastní školení pracovníka ze skupiny strojvůdců pro řízení známého typu lokomotivy (počítačově nepodporováno)
        2. dle výsledků školení je přidán (nebo nepřidán) záznam do tabulky oprávnění k řízení typů lokomotiv s atributem školeného strojvůdce a použitého typu lokomotivy

      8. Pracovník personálního oddělení - nábor nových uchazečů
        1. zjištění jména a rodného čísla uchazeče pro nový záznam v tabulkách pracovníků (relace pracovnik nebo některá další z ISA podle pracovního zařazení)
        2. pokud se nahlášené rodné číslo již nachází v tabulkách pracovníků operace končí
        3. vytvoření nového záznamu; ve spolupráci s koordinátorem činnosti nádraží bude nový pracovník zařazen do pracovního procesu

      9. Pracovník personálního oddělení - propouštění pracovníků
        1. na základě smlouvy o ukončení pracovního poměru je příslušný pracovník smazán z tabulek pracovníků

        pozn.: změny v pracovním kolektivu je schopen zaznamenat koordinátor činnosti nádraží, který se snaží nahradit činnost propuštěných pracovníků jinými lidskými zdroji, nejlépe nově přijatými

      10. Koordinátor činnosti nádraží - alokace lidských zdrojů
        1. zjištění neobsazeného pracoviště na nádraží - takového, pro které existuje méně záznamů v relaci Zamestnani nez je atribut pocet_mist relace Pracoviste (zřejmě jednotlivě pro všechny definované směny (relace Smena))
        2. pro neobsazené pracoviště se zkusí nalézt pracovník s příslušnou kvalifikací (relace Skupina_pracovist pro aktualní pracoviště koresponduje s relací Skupina_pracovníku pro vytypovaného pracovníka; Pokladní jsou přiřazováni na pracoviště ze skupiny s popisem Pokladna), který má čas (pro danou směnu ještě nemají záznam v tabulce Zaměstnání)
        3. z výše zjištěných informací dojde k vytvoření záznamu v tabulce Zaměstnání
        4. postup se opakuje dokud existují neobsazená pracoviště a je možné je spárovat s nevytíženým pracovníkem
        5. pracovníci posunovači (relace Posunovac) pracují na kolejích a jsou navíc asociováni se spoji, které mají na jejich nádraží(tozn. jejich pracoviště je tamtéž) vzniknout (tozn. je tam jejich časově první stanice v jízdním řádu (zde v relaci Zastavka)). Alokace probíhá probíhá podle analogického schématu
        6. pro speciální pracovní místa, kterými jsou výhybky (z relace Vyhybka) jsou podle analogického schématu přiděleni nevytížení výhybkáři (relace Vyhybkar) jakozto potomci Pracovnika v ramci ISA hierarchie. Atributem vztahu mezi výhybkářem a výhybkou je pracovní doba na výhybce (atributy vyhyb_od a vyhyb_do), kterou je vhodné optimalizovát v závislosti na jízdním řádu spojů opouštějících nádraží a je tedy nezávislá na globálně zavedených směnách
        7. pro speciální pracovní místa, kterými jsou spoje (z relace Spoj) jsou podle analogického schématu přiděleni nevytížení strojvůdci (relace Strojvudce), u nichž je podmínkou že mají záznam v tabulce oprávnění k řízení toho typu lokomotivy, který je použit jako pohon spoje. Pracovní dobou, která je zde rozhodující při výběru pracovníka se rozumí doba cesty spoje (dolní hranice = odjezd spoje (< minimum z dob příjezdů spoje do zastávek); horní hranice = příjezd spoje (> maximum z dob odjezdů spoje ze zastávek))

      11. Koordinátor činnosti nádraží - správa pracovišť
        1. přidávání nových záznamů do tabulky pracovišť (relace Pracoviste) dle potřeb provozu nádraží
        2. mazání záznamů z tabulky pracovišť pro nepotřebná nebo neefektivně pracující pracoviště
        3. pro každé smazané pracoviště je nutné smazat odpovídající záznamy v tabulce zaměstnání (relace Zamestnani)
        4. pro přidaná pracoviště je nutné provést operaci alokace lidských zdrojů

        pozn.: pro úpravu pravoviště, které má obsahovat výhybku (zřejmě popis jeho skupiny pracovišť bude např. "Výhybky") je třeba provést ještě přidání/mazání záznamů z tabulky Vyhybky

      12. Rozvrhář spojů - návrh spoje
        1. nový spoj je složen z vozů, z nichž alespoň jeden je z tabulky Lokomotiv a zároveň platí, že po celou dobu jízdy nového spoje jsou všechny vozy neobsazeny v jiném spoji, tj. pro každý spoj, ve kterém se vůz již vyskytuje platí, že množina uvažovaných časů a již obsazených (dolní hranice = odjezd spoje (< minimum z dob příjezdů spoje do zastávek); horní hranice = příjezd spoje (> maximum z dob odjezdů spoje ze zastávek)) má prázdný průnik. Tato operace může být podporována funkcí klientské aplikace pracující nad databází
        2. vytipované vozy se propojí s nově vznikajícím spojem prostřednictvím tabulky řazení spoje (relace Razeni), kam se zapíše pořadí každého vozu v rámci spoje (tažnou lokomotivu vhodno umísťovat na pozici 0, resp. 1) a některé doplňující atributy (viz atributy entity Razeni)
        3. zastávky nového spoje a jejich časy se zapíší do tabulky zastávek (relace Zastavky) a to tak, aby platilo, že spoj v zastávce nezastaví na koleji, na které se mezi jeho časem příjezdu a odjezdu vyskytuje jiný spoj. Index koleje je omezen na maximální hodnotu rovnou atributu pocet_koleji uvažované stanice Tato operace může být podporována funkcí klientské aplikace pracující nad databází
        4. jeden z vozů, které jsou lokomotiva musí být použit jako pohon vlaku a zapíše se pro nový spoj do tabulky pohonů (relace Pohon). Pomocný atribut nasobnost je možné použít variabilně dle požadavků každého pracovního týmu
        5. zbývá doplnit ostatní atributy spoje pro správný export jízdního řádu: zda-li se jedná o zrychlený, osobní nebo nákladní spoj, v jaké dny jede apod. (viz atributy entity Spoj)

        pozn.: po návrhu spoje je nutný následný zásah Koordinátora činnosti nádraží, který novému spoji přiřadí volného strojvedoucího s příslušným oprávněním k řízení použité lokomotivy v rámci operace alokace lidských zdrojů

      13. Rozvrhář spojů - zrušení spoje
        1. smazání záznamu z tabulky spojů (relace Spoje)
        2. smazání záznamů z tabulky řazení (relace Razeni), které byly identifikovány smazaným spojem
        3. analogicky pro relaci Zastavka a Pohon

        pozn.: pokud to vyžaduje implementace, je nutné smazat rovněž záznam o strojvedoucím ke spoji přiděleném

      14. Rozvrhář spojů - export jízdního řádu
        1. pro export jízdního řádu jsou důležité informace obsažené v relacích: Spoj, Razeni, Zastavka

      15. Strojvůdce, Posunovač, Výhybkář - plnění pracovních úkolů
        1. zjištění informací o pracovním úkolu z databáze (pro strojvůdce a posunovače jsou důležité záznamy z tabulky spojů (relace Spoj), které souvisejí s jejich osobou (resp. klíčem pracovníka, kterým je atribut RC (rodné číslo)); pro výhybkáře pak ještě záznamy z tabulky výhybek (relace Vyhybka))
        2. plnění pracovního úkolu na zjištěných objektech (počítačově nepodporováno); u spojů je čas výkonu udán jízdním řádem (resp. informacemi k němu se vázajícími), při ovládání výhybek je rozhodující časové vymezení směny, do které patří záznam z tabulky zaměstnání pro pracoviště s danou výhybkou (podobně jako u ostatních pracovníků PPS)

      16. Pokladní - výdej jízdenek
        1. údaje o nové jízdence vyplní pokladní na základě žádosti zákazníka. Tato operace může být podporována funkcí klientské aplikace pracující nad databází
        2. cena je kalkulována na základě atributů (detska, osoby, zpatecni) a pomocí tabulky tras, která realizuje zobrazení Stanice*Stanice -> počet km. Tato operace může být podporována funkcí klientské aplikace pracující nad databází
        3. vytisknutí jízdenky, předání peněz, předání jízdenky

      17. Vedoucí servisu - údržba vozů v předepsaném technickém stavu
        1. kontrola atributu posledni_servis u všech vozů patřících k nádraží, kde pracuje (domovská stanice vozu ukazuje na stejnou stanici jako pracoviště v rámci jeho zaměstnání), které zároveň využívají lokální servis (atribut relace Vuz)
        2. vozy, které mají prošlou technickou kontrolu (nyní - posledni_servis > konstanta z vnitřního řádu železnice) předá k prohlídce servisním technikům, které má na svém pracovišti k dispozici

      18. Servisní technik - plnění pracovních úkolů
        1. zjištění informací o pracovním úkolu z databáze - tabulka zaměstnání (relace Zamestnani) obsahuje záznamy o jemu přiděleném pracovišti a pracovní době (atribut smerovka u pracoviště může sloužit k jeho správné fyzické identifikaci)
        2. v rámci směny (pracovní doby) plní příkazy vedoucího servisu, který rozdává práci mezi servisní techniky v závislosti na aktuálních potřebách vozového fondu

      19. Výpravčí, Hlasatel spojů - plnění pracovních úkolů
        1. zjištění informací o pracovním úkolu z databáze - tabulka zaměstnání (relace Zamestnani) obsahuje záznamy o jemu přiděleném pracovišti a pracovní době (atribut smerovka u pracoviště může sloužit k jeho správné fyzické identifikaci)
        2. v rámci směny (pracovní doby) plní pracovní úkol, k čemuž mu slouží informace z tabulky spojů (relace Spoj), zastávek (relace Zastavka), ev. řazení (relace Razeni)

        pozn.: těmto pracovníkům stačí z jimi používaných tabulek v databázi informace týkající se stanic, v rámci kterých plní služební povinnosti (Toto omezení může být podporováno klientskou aplikací pracující nad databází nebo lépe vhodnými přístupovými pravy k tabulkám - řeší Správce databáze)

      20. Uklízečka - plnění pracovních úkolů
        1. zjištění informací o pracovním úkolu z databáze - tabulka zaměstnání (relace Zamestnani) obsahuje záznamy o jemu přiděleném pracovišti a pracovní době
        2. v rámci směny (pracovní doby) plní pracovní úkol, k čemuž mu nepotřebuje žádné další informace

        pozn.: jedná se o pracovní roli, která je nejjednodušší z hlediska přístupu k databázi - stačí jí pouze informace o místu a času přidělené práce


    5. Dotazy v Relační algebře:

      V následujícím odstavci jsou body postupů uživatelských scénářů, které obsahují dotazy nad databází, přepsány do jazyku Relační algebry:

      • Školitel strojvedoucích - školení strojvedoucích
        Vstup: Rodné číslo pracovníka, kterého se akce týká = X; Typ lokomotivy ke školení = Y

        Dotaz, zda-li je dotyčný pracovník strojvedoucí:
        	STROJVUDCE(PRACOVNIK_RC = X)
        Dotaz, zda-li dotyčný pracovník již požadované oprávnění nemá:
        	OPRAVNENI(OPRAVNEN_PRACOVNIK_RC = X, K_RIZENI_TYP_VUZ_ID_TYP_VUZ = Y)
      • Pracovník personálního oddělení - nábor nových uchazečů
        Vstup: Rodné číslo osoby, které se akce týká = X

        Dotaz, zda-li dotyčná osoba již není pracovníkem železnice:
        	PRACOVNIK(RC = X)
      • Koordinátor cinnosti nádraží - alokace lidských zdrojů

        Dotaz na neobsazená pracoviště v jednotlivých směnách:
        	{ SMENA[true]PRACOVISTE }(POCET_MIST > count(ZAMESTNANI(ID_PRACOVISTE = PRACOVISTE_ID_PRACOVISTE, SMENA_CISLO_SMENY = CISLO_SMENY))
        Nalezení pracovníka s kvalifikací pro neobsazené pracoviště, který je v obsazované směně ještě volný:
        Vstup (z předchozího): Popis skupiny pracovišť, které se má obsazovat = X; Směna, do které se má obsazovat = Y
        	{ {OBECNY - {OBECNY[*]ZAMESTNANI}(SMENA_CISLO_SMENY = Y)[atributy OBECNY] } [SKUPINA_Z_POPIS = POPIS] SKUPINA_PRACOVNIKU }(OD_PRACOVIST_POPIS = X)[PRACOVNIK_RC]
        pozn.: [true] = Theta spojení s pravdivou podmínkou (<=> kartézský součin)
        pozn.: count = mohutnost množiny (pokud tuto operaci neumožníme, nebude možné zjistit neobsazená pracoviště)
        pozn.: projekce typu "atributy X" zastupuje výčet všech atributů relace, na kterou je aplikována (pro přehlednost symbolů nepoužívám polospojení)

      • Rozvrhář spojů - návrh spoje

        Zjištení vozů volných pro sestavení řazení nového spoje:
        Vstup: Klíč spoje (ID_SPOJ), pro který se navrhuje řazení vozů = X
        	VUZ[ID_VUZ] - { VUZ[*]RAZENI[*]SPOJ [ODJEZD_SPOJ < PRIJEZD_SPOJ and PRIJEZD_SPOJ > ODJEZD_SPOJ] {SPOJ(SPOJ_ID_SPOJ = 999) }[ID_VUZ] } - {analogicky pro lokomotiovy}
        	// vuz se nehodi, pokud ma odjet v jiz existujicim spoji drive nez ma prijet v novem a zaroven ma prijet v jiz existujicim pozdeji nez odjet v novem
        	// <=> musi platit, ze ve starem spoji bud odjede pozdeji nez prijede v novem nebo prijede drive nez odjede v novem
        Test na obsazenost kolejí stanice pro požadovaný časový interval:
        Vstup: Klíč Stanice (ID_STANICE) = X; Čas příjezdu do stanice = X; Čas opuštění stanice = Y
        	ZASTAVKA(STANICE_ID_STANICE = X)(ODJEZD > X)(PRIJEZD < Y)[KOLEJ]
        	// kolej je obsazena, pokud souhlasi stanice zastavky a existujici vlak ma odjet pozdeji nez novy prijede a ma prijet driv nez novy odjede
        pozn.: and v podmínce Theta-spojení zde znači operaci logického součinu
        pozn.: v případě podobných, avšak ne striktně totožných identifikátorů atributů použitých pro součin (např. ID_VUZ a VUZ_ID_VUZ), kdy je zřejmé, přes které atributy se má provádět párování, jsem si v zájmu přehlednosti výrazů dovolil užít rovnou přirozeného součinu namísto správnějšího Theta součinu s jejich pravým pojmenováním.
        pozn.: v případě totožných identifikátorů atributů v binární operaci podmínky Theta-spojení patří levý atribut k levému operandu spojení a pravý k pravému.

      • Rozvrhář spojů - export jízdního řádu
        Vstup: Klíč spoje (ID_SPOJ), pro který se má generovat jízdní řád = X

        Generické vlastnosti spoje:
        	SPOJ(ID_SPOJ = X)[ZRYCHLENY, ID_SPOJ, JEDE_SOBOTA, JEDE_NEDELE, JEDE_SVATEK]
        Zastávky spoje - nádraží, časy, koleje:
        	{ SPOJ(SPOJ_ID_SPOJ = X) [*] ZASTAVKA [*] STANICE }[NAZEV, MESTO, KOLEJ, NASTUPISTE, PRIJEZD, ODJEZD]
        Řazení vagonů spoje a jejich vlastnosti:
        	{ RAZENI(SPOJ_ID_SPOJ = X) [*] VAGON [*] TYP_VAGON [*] TYP_VUZ }[PORADI, KURACKY, KAPACITA, DRUH, HMOTNOST]
      • Strojvůdce, Posunovač, Výhybkář - plnění pracovních úkolů
        Vstup: Jméno pracovníka = X

        Strojvůdce - dotaz na jím řízené spoje:
        	{ SPOJ [RIZENI_PRACOVNIK_RC = RC] PRACOVNIK(JMENO = X) }[SPOJ_ID, ODJEZD_SPOJ, PRIJEZD_SPOJ]
        Posunovač - dotaz na jím posunované spoje:
        	{ SPOJ [POSUN_PRACOVNIK_RC = RC] PRACOVNIK(JMENO = X) }[SPOJ_ID, ODJEZD_SPOJ, PRIJEZD_SPOJ]
        Výhybkář - dotaz na jím obsluhované výhybky:
        	{ { PRACOVNIK(JMENO = X) [*] ZAMESTNANI [*] PRACOVISTE } [ID_PRACOVISTE = UMISTENI_V_ID_PRACOVISTE] VYHYBKA }[atributy Vyhybka]
      • Pokladní - výdej jízdenek
        Vstup: Název nástupní stanice = X; Název výstupní stanice = Y

        Kalkulace ceny - zjištění kilometrické vzdálenosi cesty:
        	{ STANICE(NAZEV = X) [UMISTENI_S_ID_LOKACE = ZACATEK_ID_LOKACE] TRASA [KONEC_ID_LOKACE = UMISTENI_S_ID_LOKACE] STANICE(NAZEV = Y) }[NAZEV][KILOMETRY]
      • Vedoucí servisu - údržba vozů v předepsaném technickém stavu
        Vstup: Datum poslední platné servisní prohlídky = X; Klíč stanice (ID_STANICE), o kterou se jedná = Y

        Vytipovaní vozů zralých na servisní prohlidku, které zároveň využívají lokální servis ve své domovské stanici:
        	VUZ(POSLEDNI_SERVIS < X, DOMA_LOKALNI_SERVIS = true, DOMOV_ID_STANICE = Y)
        Vytipovaní pracovniků (servisních techniků), které má na svém nádraží k dispozici:
        	{ OBECNY(SKUPINA_Z_POPIS = "SERVISNI TECHNICI") [*] ZAMESTNANI(PRACOVISTE_ID_PRACOVISTE = Y) }[PRACOVNIK_RC]
      • Výpravčí, Hlasatel spojů - plnění pracovních úkolů
        Vstup: Název stanice jeho pracoviště = X

        Jízdní řád pro stanici jeho pracoviště:
        	{ STANICE(NAZEV = X) [*] ZASTAVKA [*] SPOJ }[KOLEJ, NASTUPISTE, ZASTAVKA.PRIJEZD, ZASTAVKA.ODJEZD, OSOBNI_NAKLADNI]
      • Pracovník typu PPS - zjištění informací o pracovním úkolu
        Vstup: Jméno pracovníka = X

        Dotaz na směrovku k nalezení jemu přiděleného pracoviště:
        	{ PRACOVNIK(JMENO = X) [*] ZAMESTNANI [*] PRACOVISTE }[PRACOVISTE_ID_PRACOVISTE, SMEROVKA]
        Dotaz na pracovní dobu pro jemu přidělené pracoviště:
        	{ PRACOVNIK(JMENO = X) [*] ZAMESTNANI [*] SMENA }[PRACOVISTE_ID_PRACOVISTE, OD, DO]

    6. Poznámky, postřehy, dodatky:

      • Atributy relací, které mají význam datového typu Boolean implementuji v Oracle jako Number/Integer (bylo by možné implementovat je jako vlajky a vložit jich více do jednoho čísla, ale v tomto projektu to není účelné)
      • Záznamy o čase, které mají periodicitu 1 den (např. příjezdy/odjezdy pravidelných spojů) mohou mít v polích DD-MM-YYYY jakoukoliv, avšak pro účely jejich srovnávání stejnou hodnotu (pro naznačení času, který končí až další den bude pak tato hodnota o den (ev. i více) posunuta oproti zvolené referenční (zde 01.01.2006))
      • Zde uvádím vybrané kontroly logických nekonzistenci, jejichž realizace by mohla být prováděna na úrovni klientské aplikace nebo v případě těch jednodušších na úrovni vhodně definovaných integritních omezení tabulek (CHECK option) přímo v rámci databázového stroje:
        • kontrola, zda-li některý ze strojvůdců neřídí lokomotivu na jejíž typ nevlastní řidičské oprávnění
        • kontrola, zda-li některý ze zaměstnanců není přidělen do více překrývajících se směn v rámci různých činností
        • kontrola, zda-li v jeden okamžik není žádná kolej konkrétní stanice obsazena více než 1 vlakem
        • kontrola na zacyklené výhybky
        • kontrola na lichý počet kol vozu (typu vozů)
        • kontrola, zda-li hmotnost vagonů ve spoji nepřevyšuje tažnou hmotnost pohonů
        • kontrola, zda-li se příjezdy do zastávek nekonají dříve než odjezdy (a naopak u spojů)

  2. SQL skripty

  3. Závěr:

    Odpovědi na dotazy vyhovují očekávání.

Práci jsem vytvořil samostatně s využitím těchto informačních zdrojů:

Pokorný, Halaška: Databázové systémy, skripta, Vydavatelství ČVUT, Praha 2002
Webová stránka podpory výuky: http://service.felk.cvut.cz/courses/X36DBS

© 2006 Jan Skalicky
cz (dot) skalda (at) seznam (dot) cz