Cílem předmětu je seznámit studenty se základními principy vývoje, provozu a řízení informačního systému podniku založeného na moderních informačních technologiích. Ve cvičeních studenti získají zkušenosti s modelováním podnikových procesů, s definicí informatické podpory těchto procesů a s týmovým
Předmět pokrývá celý proces analýzy a návrhu informačních systémů — od sběru požadavků přes modelování (UML, DFD, ERD) až po architektonické vzory a návrh databází a API. Klade důraz na systematické postupy a praktické dovednosti.
Funkční požadavky: Co systém dělá.
| Kategorie | Příklady |
|---|---|
| Výkon (Performance) | Odpověď < 200ms při 100 souběžných uživatelích |
| Bezpečnost (Security) | Hesla ukládána jako bcrypt hash, HTTPS povinný |
| Dostupnost (Availability) | 99.9% uptime (max 8.7h výpadku/rok) |
| Škálovatelnost | Zvládne 10× nárůst uživatelů bez redesignu |
| Udržovatelnost | Kód splňuje SonarQube Quality Gate |
| Přenositelnost | Běží na Linux i Windows |
Diagram Use Case: Zobrazuje aktéry a jejich interakce se systémem.
┌────────────────────────────────────┐
│ Knihovní systém │
│ │
┌──┐ │ ○ Vyhledat knihu │
│ │──┼─→ ○ Vypůjčit knihu │
│Čtenář│ ○ Vrátit knihu │
└──┘ │ ○ Prodloužit výpůjčku │
│ │
┌──┐ │ ○ Přidat knihu do katalogu │
│ │──┼─→ ○ Spravovat uživatele │
│Knihovník│ ○ Generovat přehledy │
└──┘ └────────────────────────────────────┘
Specifikace Use Case:
Agilní formát: "Jako [role], chci [funkce], abych [benefitt]"
Příklady:
Given [kontext]
When [akce]
Then [výsledek]
Příklad:
Given uživatel je přihlášen
When klikne na "Export CSV"
Then systém stáhne soubor s daty všech uživatelů ve formátu ISO-8601
INVEST kritéria pro dobré user stories: Independent, Negotiable, Valuable, Estimable, Small, Testable.
Zobrazuje toky dat mezi procesy, externími entitami a datovými úložišti.
Symboly (Yourdon-DeMarco notace):
Diagram úrovně 1: Rozložení systému na hlavní subsystémy.
Balancování: Vstupy/výstupy procesu na úrovni n musí odpovídat na úrovni n+1.
Modeluje datovou strukturu.
Cardinality notations (Crow's Foot):
Zákazník ||──o{ Objednávka
"jeden zákazník má nula nebo více objednávek"
Objednávka }o──|| Zákazník
"objednávka patří právě jednomu zákazníkovi"
Typy vztahů:
┌─────────────────────┐
│ <> │
│ Osoba │
├─────────────────────┤
│ - jmeno: String │
│ - email: String │
├─────────────────────┤
│ + getPrijmeni(): Str│
│ + isActive(): bool │
└─────────┬───────────┘
│ <>
┌─────┴──────┐
│ │
┌───┴──┐ ┌────┴──┐
│Zákaznk│ │Zaměstnc│
└──────┘ └───────┘
Vztahy v UML:
| Vztah | Symbol | Popis |
|---|---|---|
| Asociace | ────── | "má" vztah |
| Agregace | ──◇── | celek-část, část žije samostatně |
| Kompozice | ──◆── | celek-část, část umírá s celkem |
| Dědičnost | ──▷── | "je" vztah |
| Realizace | --▷-- | implementuje interface |
| Závislost | ──→ | "používá" |
Zobrazuje interakce mezi objekty v čase.
Uživatel UI Service Database
│ │ │ │
│─login()→│ │ │
│ │─authenticate()→ │
│ │ │─findUser()→
│ │ │←──user────│
│ │ │─checkPwd()│
│ │←─token────────│ │
│←token───│ │ │
Fragmenty: alt (alternativa/if-else), loop (smyčka), opt (volitelné), par (paralelní)
Modeluje workflow/business procesy. Podobné vývojovým diagramům, ale s UML notací.
Prvky: Počáteční uzel, akce, rozhodovací uzel (diamond), fork/join (souběžnost), konečný uzel.
Pro objekty s komplexním životním cyklem.
[*] → Nová ─────────────→ Zpracování ──→ Odeslaná
(potvrdit) │
│ (doručit)
│ ↓
Stornovaná ←────────────── Doručená
(stornovat)
Přechod: Spouštěcí událost [guard condition] / akce
Singleton — zajistí, že třída má pouze jednu instanci.
class DatabaseConnection:
_instance = None
@classmethod
def get_instance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance
def __init__(self):
self.connection = self._connect()
Factory Method — vytvoření objektu bez specifikace konkrétní třídy.
class NotificationFactory:
@staticmethod
def create(type: str):
if type == "email":
return EmailNotification()
elif type == "sms":
return SMSNotification()
raise ValueError(f"Unknown type: {type}")
MVC (Model-View-Controller):
class UserRepository:
def __init__(self, db_session):
self.session = db_session
def find_by_id(self, user_id: int) -> User:
return self.session.query(User).filter_by(id=user_id).first()
def save(self, user: User) -> User:
self.session.add(user)
self.session.commit()
return user
Observer Pattern — publish-subscribe mechanismus.
class EventEmitter:
def __init__(self):
self._listeners = {}
def on(self, event: str, callback):
self._listeners.setdefault(event, []).append(callback)
def emit(self, event: str, data=None):
for callback in self._listeners.get(event, []):
callback(data)
# Použití
emitter = EventEmitter()
emitter.on("user_created", send_welcome_email)
emitter.on("user_created", create_audit_log)
emitter.emit("user_created", {"email": "jan@example.com"})
1NF (První normální forma):
-- Příklad porušení 3NF a náprava
-- ŠPATNĚ: student_id → student_jmeno (tranzitivní přes student)
CREATE TABLE zapis (
student_id INT,
predmet_kod VARCHAR(10),
student_jmeno VARCHAR(100), -- závisí na student_id, ne na klíči
znamka INT,
PRIMARY KEY (student_id, predmet_kod)
);
-- SPRÁVNĚ: rozložení do 3NF
CREATE TABLE studenti (student_id INT PRIMARY KEY, jmeno VARCHAR(100));
CREATE TABLE zapisy (
student_id INT REFERENCES studenti,
predmet_kod VARCHAR(10),
znamka INT,
PRIMARY KEY (student_id, predmet_kod)
);
Indexy:
-- B-tree index (výchozí) — pro =, <, >, BETWEEN, ORDER BY
CREATE INDEX idx_users_email ON users(email);
-- Složený index — pořadí záleží!
CREATE INDEX idx_orders_user_date ON orders(user_id, created_at);
-- Partial index — indexuje jen podmnožinu
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;
Partitioning — rozdělení velké tabulky pro výkon:
6 omezení REST:
GET /users # seznam uživatelů
POST /users # vytvoření uživatele
GET /users/{id} # konkrétní uživatel
PUT /users/{id} # nahrazení uživatele
PATCH /users/{id} # částečná aktualizace
DELETE /users/{id} # smazání uživatele
GET /users/{id}/orders # objednávky uživatele
HTTP Status kódy:
| Kód | Popis | Kdy použít |
|---|---|---|
| 200 | OK | Úspěšný GET, PUT, PATCH |
| 201 | Created | Úspěšný POST |
| 204 | No Content | Úspěšný DELETE |
| 400 | Bad Request | Neplatná data |
| 401 | Unauthorized | Chybí autentizace |
| 403 | Forbidden | Nemá oprávnění |
| 404 | Not Found | Zdroj neexistuje |
| 409 | Conflict | Duplicitní záznam |
| 422 | Unprocessable | Validační chyba |
| 500 | Internal Server Error | Chyba serveru |
┌──────────────────────────────┐
│ Presentation Layer │ API Controllers, Views
├──────────────────────────────┤
│ Application Layer │ Use Cases, Application Services
├──────────────────────────────┤
│ Domain Layer │ Entities, Domain Services, Rules
├──────────────────────────────┤
│ Infrastructure Layer │ DB, External APIs, Email
└──────────────────────────────┘
Clean Architecture / Onion Architecture: Závislosti směřují pouze dovnitř (Domain Layer nezávisí na ničem).
Komponenty komunikují prostřednictvím událostí (events).
Výhody: Loose coupling, škálovatelnost, audit trail. Vzory: Event Sourcing (stav = sekvence eventů), CQRS (oddělení čtení a zápisu).
Command → Command Handler → Event → Event Handler(s)
"Vytvoř objednávku" → validace, uložení → OrderCreated → [email, sklad, statistiky]
Kdy mikroservisy:
Používej Markdown: ## Nadpis, **tučně**, `kód`, - odrážky, > citace