Projektszenario

Geschätzte Lektüre: 8 Minuten 130 Ansichten

Eigene Anwendung designen

Setzen wir das Gelernte in einem praktischen Design-Projekt um. Wir entwerfen das Datenbankschema für eine der drei genannten Anwendungen. Wir wählen hier einen Task Manager (Aufgabenverwaltung), da dieses Szenario alle relevanten Aspekte abdeckt.

Anforderungsanalyse

Wir entwickeln eine Anwendung zur Verwaltung von Aufgaben. Die Anforderungen:

  • Benutzer können sich registrieren und anmelden.
  • Jeder Benutzer kann Aufgaben erstellen, bearbeiten und löschen.
  • Aufgaben haben einen Titel, eine Beschreibung, einen Status (offen, in Arbeit, erledigt), eine Priorität und ein Fälligkeitsdatum.
  • Aufgaben können Kategorien zugeordnet werden (z. B. Arbeit, Privat, Einkauf).
  • Aufgaben können untereinander abhängig sein (eine Aufgabe kann eine andere voraussetzen).
  • Benutzer können Kommentare zu Aufgaben hinterlassen.

Entitäten identifizieren

Aus den Anforderungen identifizieren wir folgende Entitäten:

  • benutzer – Speichert Nutzerdaten
  • aufgaben – Speichert die Aufgaben
  • kategorien – Speichert mögliche Kategorien
  • aufgaben_kategorien – Verknüpfungstabelle (n:m)
  • aufgaben_abhaengigkeiten – Selbstreferenzierende n:m-Beziehung für Aufgabenabhängigkeiten
  • kommentare – Kommentare zu Aufgaben

SQL-Implementierung

Hier ist das vollständige SQL-Skript für den Task Manager. Führen Sie es in Ihrer MAMP-Umgebung in einer neuen Datenbank taskmanager aus.

-- Datenbank erstellen
CREATE DATABASE IF NOT EXISTS taskmanager;
USE taskmanager;

-- Benutzer
CREATE TABLE benutzer (
    id INT AUTO_INCREMENT PRIMARY KEY,
    benutzername VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    passwort_hash VARCHAR(255) NOT NULL,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Kategorien
CREATE TABLE kategorien (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) UNIQUE NOT NULL,
    farbe VARCHAR(7) DEFAULT '#808080'
);

-- Aufgaben
CREATE TABLE aufgaben (
    id INT AUTO_INCREMENT PRIMARY KEY,
    titel VARCHAR(255) NOT NULL,
    beschreibung TEXT,
    status ENUM('offen', 'in_arbeit', 'erledigt', 'archiviert') DEFAULT 'offen',
    prioritaet ENUM('niedrig', 'mittel', 'hoch', 'kritisch') DEFAULT 'mittel',
    faelligkeitsdatum DATE,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    aktualisiert_am DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    erstellt_von INT NOT NULL,
    zugewiesen_an INT,
    FOREIGN KEY (erstellt_von) REFERENCES benutzer(id) ON DELETE RESTRICT,
    FOREIGN KEY (zugewiesen_an) REFERENCES benutzer(id) ON DELETE SET NULL
);

-- Aufgaben-Kategorien (n:m)
CREATE TABLE aufgaben_kategorien (
    aufgabe_id INT NOT NULL,
    kategorie_id INT NOT NULL,
    PRIMARY KEY (aufgabe_id, kategorie_id),
    FOREIGN KEY (aufgabe_id) REFERENCES aufgaben(id) ON DELETE CASCADE,
    FOREIGN KEY (kategorie_id) REFERENCES kategorien(id) ON DELETE CASCADE
);

-- Aufgaben-Abhängigkeiten (selbstreferenzierend, n:m)
CREATE TABLE aufgaben_abhaengigkeiten (
    aufgabe_id INT NOT NULL,
    voraussetzung_id INT NOT NULL,
    PRIMARY KEY (aufgabe_id, voraussetzung_id),
    FOREIGN KEY (aufgabe_id) REFERENCES aufgaben(id) ON DELETE CASCADE,
    FOREIGN KEY (voraussetzung_id) REFERENCES aufgaben(id) ON DELETE CASCADE,
    CHECK (aufgabe_id != voraussetzung_id)
);

-- Kommentare
CREATE TABLE kommentare (
    id INT AUTO_INCREMENT PRIMARY KEY,
    aufgabe_id INT NOT NULL,
    benutzer_id INT NOT NULL,
    inhalt TEXT NOT NULL,
    erstellt_am DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (aufgabe_id) REFERENCES aufgaben(id) ON DELETE CASCADE,
    FOREIGN KEY (benutzer_id) REFERENCES benutzer(id) ON DELETE CASCADE
);

-- Beispieldaten
INSERT INTO benutzer (benutzername, email, passwort_hash) VALUES
('anna_s', 'anna@example.de', 'hash_placeholder_1'),
('ben_weber', 'ben@example.de', 'hash_placeholder_2');

INSERT INTO kategorien (name, farbe) VALUES
('Arbeit', '#FF5733'),
('Privat', '#33FF57'),
('Einkauf', '#3357FF'),
('Lernen', '#FF33F5');

INSERT INTO aufgaben (titel, beschreibung, status, prioritaet, faelligkeitsdatum, erstellt_von, zugewiesen_an) VALUES
('Präsentation vorbereiten', 'Folien für die Projektpräsentation erstellen', 'in_arbeit', 'hoch', '2024-04-15', 1, 1),
('Lebensmittel kaufen', 'Milch, Brot, Obst, Gemüse', 'offen', 'mittel', '2024-04-10', 2, 2),
('SQL-Tutorial abschließen', 'Letzte Lektion durcharbeiten und Übungen machen', 'offen', 'hoch', '2024-04-20', 1, 1),
('Team-Meeting einberufen', 'Neue Sprint-Ziele besprechen', 'erledigt', 'mittel', '2024-04-05', 1, 2);

INSERT INTO aufgaben_kategorien (aufgabe_id, kategorie_id) VALUES
(1, 1), -- Präsentation -> Arbeit
(2, 3), -- Lebensmittel -> Einkauf
(3, 4), -- SQL-Tutorial -> Lernen
(4, 1); -- Team-Meeting -> Arbeit

INSERT INTO kommentare (aufgabe_id, benutzer_id, inhalt) VALUES
(1, 2, 'Bitte auch die Finanzzahlen einarbeiten.'),
(3, 1, 'Der JOIN-Teil war besonders hilfreich.');

Dieses Design folgt den Normalisierungsprinzipien, verwendet sinnvolle Datentypen und Constraints und bildet alle identifizierten Anforderungen ab.


Dieses Dokument teilen

Projektszenario

Oder Link kopieren

INHALT

Abonnieren

×
Cancel