it-themen:projekt:dokumentation:bewerbungsnachweis_datenbankstruktur_sql
**Dies ist eine alte Version des Dokuments!**
/* Bewerbungsnachweis – SQL-DDL Engine: InnoDB Charset: utf8mb4 Hinweis: Diese DDL entspricht der finalen Struktur (firma, stelle, bewerbung, status_verlauf, dokument + View). */ SET NAMES utf8mb4; SET time_zone = '+00:00'; -- ========================= -- Tabelle: firma -- ========================= CREATE TABLE IF NOT EXISTS firma ( firma_id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(200) NOT NULL, ort VARCHAR(200) NULL, webseite VARCHAR(300) NULL, notizen TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (firma_id), KEY idx_firma_name (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================= -- Tabelle: stelle -- ========================= CREATE TABLE IF NOT EXISTS stelle ( stelle_id INT UNSIGNED NOT NULL AUTO_INCREMENT, firma_id INT UNSIGNED NOT NULL, titel VARCHAR(250) NOT NULL, referenznummer VARCHAR(120) NULL, stellen_url VARCHAR(500) NULL, quelle_plattform VARCHAR(150) NULL, ort_text VARCHAR(200) NULL, arbeitsmodell VARCHAR(80) NULL, beschaeftigung VARCHAR(80) NULL, notizen TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (stelle_id), KEY idx_stelle_firma (firma_id), KEY idx_stelle_titel (titel), CONSTRAINT fk_stelle_firma FOREIGN KEY (firma_id) REFERENCES firma(firma_id) ON UPDATE RESTRICT ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================= -- Tabelle: bewerbung -- ========================= CREATE TABLE IF NOT EXISTS bewerbung ( bewerbung_id INT UNSIGNED NOT NULL AUTO_INCREMENT, stelle_id INT UNSIGNED NOT NULL, bewerbungsdatum DATE NOT NULL, kanal VARCHAR(40) NOT NULL, aktueller_status VARCHAR(40) NOT NULL DEFAULT 'offen', naechstes_nachfassen DATE NULL, betreff VARCHAR(250) NULL, notizen TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (bewerbung_id), KEY idx_bew_stelle (stelle_id), KEY idx_bew_datum (bewerbungsdatum), KEY idx_bew_status (aktueller_status), KEY idx_bew_nachfassen (naechstes_nachfassen), CONSTRAINT fk_bewerbung_stelle FOREIGN KEY (stelle_id) REFERENCES stelle(stelle_id) ON UPDATE RESTRICT ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================= -- Tabelle: status_verlauf -- ========================= CREATE TABLE IF NOT EXISTS status_verlauf ( status_verlauf_id INT UNSIGNED NOT NULL AUTO_INCREMENT, bewerbung_id INT UNSIGNED NOT NULL, status VARCHAR(40) NOT NULL, status_datum DATE NOT NULL, quelle VARCHAR(80) NULL, notizen TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (status_verlauf_id), KEY idx_sv_bew (bewerbung_id), KEY idx_sv_datum (status_datum), KEY idx_sv_status (status), CONSTRAINT fk_statusverlauf_bewerbung FOREIGN KEY (bewerbung_id) REFERENCES bewerbung(bewerbung_id) ON UPDATE RESTRICT ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================= -- Tabelle: dokument -- ========================= CREATE TABLE IF NOT EXISTS dokument ( dokument_id INT UNSIGNED NOT NULL AUTO_INCREMENT, bewerbung_id INT UNSIGNED NOT NULL, typ VARCHAR(60) NOT NULL, dateipfad VARCHAR(600) NULL, url VARCHAR(600) NULL, erstellt_am_datum DATE NOT NULL, notizen TEXT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (dokument_id), KEY idx_doc_bew (bewerbung_id), KEY idx_doc_typ (typ), KEY idx_doc_datum (erstellt_am_datum), CONSTRAINT fk_dokument_bewerbung FOREIGN KEY (bewerbung_id) REFERENCES bewerbung(bewerbung_id) ON UPDATE RESTRICT ON DELETE RESTRICT ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- ========================= -- View: v_nachweis_bewerbungen_mit_belegen -- ========================= DROP VIEW IF EXISTS v_nachweis_bewerbungen_mit_belegen; CREATE VIEW v_nachweis_bewerbungen_mit_belegen AS SELECT b.bewerbung_id AS bewerbung_id, b.bewerbungsdatum AS bewerbungsdatum, f.name AS firma, s.titel AS stelle, b.kanal AS kanal, b.aktueller_status AS status, b.naechstes_nachfassen AS naechstes_nachfassen, s.referenznummer AS referenznummer, COUNT(d.dokument_id) AS anzahl_belege FROM bewerbung b JOIN stelle s ON s.stelle_id = b.stelle_id JOIN firma f ON f.firma_id = s.firma_id LEFT JOIN dokument d ON d.bewerbung_id = b.bewerbung_id GROUP BY b.bewerbung_id, b.bewerbungsdatum, f.name, s.titel, b.kanal, b.aktueller_status, b.naechstes_nachfassen, s.referenznummer;
Hinweise zur DDL
RESTRICT bei FKs: verhindert versehentliche Loeschungen (amtstauglich = kein Datenverlust).
aktuellerstatus ist bewusst redundant (Performance + einfache Auswertungen); Historie liegt in statusverlauf.
dokument.dateipfad und dokument.url koennen optional sein; mindestens eines sollte befuellt sein (Validierung macht PHP).
it-themen/projekt/dokumentation/bewerbungsnachweis_datenbankstruktur_sql.1770361128.txt.gz · Zuletzt geändert: von lars