it-themen:projekt:dokumentation:bewerbungsnachweis_datenbankstruktur_sql
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| it-themen:projekt:dokumentation:bewerbungsnachweis_datenbankstruktur_sql [06.02.2026 07:58] – angelegt lars | it-themen:projekt:dokumentation:bewerbungsnachweis_datenbankstruktur_sql [06.02.2026 08:11] (aktuell) – lars | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| [[..: | [[..: | ||
| - | <code sql> /* Bewerbungsnachweis – SQL-DDL Engine: InnoDB Charset: utf8mb4 Hinweis: Diese DDL entspricht der finalen Struktur | + | <code sql> /* ========================================================= |
| + | | ||
| + | - deutsch benannte Tabellen und Spalten | ||
| + | - inkl. Status-Historie, Aktivitaeten, Dokumenten-Nachweisen | ||
| + | - Views fuer Nachweis-Export | ||
| + | - Trigger: Statusaenderung -> Historie | ||
| + | | ||
| - | SET NAMES utf8mb4; | + | /* 1) Datenbank komplett neu */ |
| - | SET time_zone = ' | + | DROP DATABASE IF EXISTS bewerbungen; |
| - | -- ========================= | + | CREATE |
| - | -- Tabelle: firma | + | |
| - | -- ========================= | + | COLLATE utf8mb4_unicode_ci; |
| - | CREATE | + | |
| - | 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 | + | |
| - | -- ========================= | + | USE bewerbungen; |
| - | -- 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 | + | 2) Tabellen |
| - | -- ========================= | + | ========================================================= */ |
| - | 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 ' | + | |
| - | 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; | + | |
| - | -- ========================= | + | CREATE TABLE firma ( |
| - | -- Tabelle: status_verlauf | + | |
| - | -- ========================= | + | |
| - | CREATE TABLE IF NOT EXISTS status_verlauf | + | |
| - | status_verlauf_id INT UNSIGNED NOT NULL AUTO_INCREMENT, | + | |
| - | bewerbung_id INT UNSIGNED | + | notizen |
| - | status | + | |
| - | status_datum DATE NOT NULL, | + | ) ENGINE=InnoDB; |
| - | quelle | + | |
| - | notizen TEXT NULL, | + | |
| - | created_at DATETIME | + | |
| - | 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 | + | |
| - | -- ========================= | + | CREATE TABLE ansprechpartner |
| - | -- Tabelle: dokument | + | |
| - | -- ========================= | + | |
| - | CREATE TABLE IF NOT EXISTS dokument | + | |
| - | dokument_id INT UNSIGNED NOT NULL AUTO_INCREMENT, | + | |
| - | bewerbung_id INT UNSIGNED | + | |
| - | typ VARCHAR(60) NOT NULL, | + | |
| - | dateipfad | + | notizen |
| - | url VARCHAR(600) NULL, | + | |
| - | erstellt_am_datum DATE NOT NULL, | + | CONSTRAINT |
| - | notizen TEXT NULL, | + | FOREIGN KEY (firma_id) REFERENCES |
| - | created_at DATETIME | + | ON DELETE |
| - | PRIMARY KEY (dokument_id), | + | ) ENGINE=InnoDB; |
| - | KEY idx_doc_bew (bewerbung_id), | + | |
| - | KEY idx_doc_typ (typ), | + | |
| - | KEY idx_doc_datum (erstellt_am_datum), | + | |
| - | CONSTRAINT | + | |
| - | FOREIGN KEY (bewerbung_id) REFERENCES | + | |
| - | ON UPDATE RESTRICT | + | |
| - | ON DELETE | + | |
| - | ) ENGINE=InnoDB | + | |
| - | -- ========================= | + | CREATE TABLE stelle ( |
| - | -- View: v_nachweis_bewerbungen_mit_belegen | + | stelle_id |
| - | -- ========================= | + | firma_id |
| - | DROP VIEW IF EXISTS v_nachweis_bewerbungen_mit_belegen; | + | titel VARCHAR(255) NOT NULL, |
| + | referenznummer | ||
| + | stellen_url | ||
| + | quelle_plattform VARCHAR(120), | ||
| + | | ||
| + | arbeitsmodell | ||
| + | | ||
| + | notizen | ||
| + | erstellt_am | ||
| + | CONSTRAINT fk_stelle_firma | ||
| + | FOREIGN KEY (firma_id) REFERENCES firma(firma_id) | ||
| + | ON DELETE CASCADE | ||
| + | ) ENGINE=InnoDB; | ||
| - | CREATE VIEW v_nachweis_bewerbungen_mit_belegen | + | CREATE |
| + | bewerbung_id | ||
| + | stelle_id | ||
| + | bewerbungsdatum | ||
| + | kanal | ||
| + | aktueller_status | ||
| + | naechstes_nachfassen DATE NULL, | ||
| + | betreff | ||
| + | notizen | ||
| + | erstellt_am | ||
| + | CONSTRAINT fk_bewerbung_stelle | ||
| + | FOREIGN KEY (stelle_id) REFERENCES stelle(stelle_id) | ||
| + | ON DELETE CASCADE, | ||
| + | INDEX idx_bewerbung_datum (bewerbungsdatum), | ||
| + | INDEX idx_bewerbung_status (aktueller_status), | ||
| + | INDEX idx_bewerbung_nachfassen (naechstes_nachfassen) | ||
| + | ) ENGINE=InnoDB; | ||
| + | |||
| + | CREATE TABLE status_verlauf ( | ||
| + | status_verlauf_id BIGINT PRIMARY KEY AUTO_INCREMENT, | ||
| + | bewerbung_id | ||
| + | status | ||
| + | status_datum | ||
| + | quelle | ||
| + | notizen | ||
| + | erstellt_am | ||
| + | CONSTRAINT fk_statusverlauf_bewerbung | ||
| + | FOREIGN KEY (bewerbung_id) REFERENCES bewerbung(bewerbung_id) | ||
| + | ON DELETE CASCADE, | ||
| + | INDEX idx_statusverlauf_bewerbung_datum (bewerbung_id, | ||
| + | ) ENGINE=InnoDB; | ||
| + | |||
| + | CREATE TABLE aktivitaet ( | ||
| + | aktivitaet_id | ||
| + | bewerbung_id | ||
| + | typ | ||
| + | zeitpunkt | ||
| + | ergebnis | ||
| + | notizen | ||
| + | erstellt_am | ||
| + | CONSTRAINT fk_aktivitaet_bewerbung | ||
| + | FOREIGN KEY (bewerbung_id) REFERENCES bewerbung(bewerbung_id) | ||
| + | ON DELETE CASCADE, | ||
| + | INDEX idx_aktivitaet_bewerbung_zeitpunkt (bewerbung_id, | ||
| + | ) ENGINE=InnoDB; | ||
| + | |||
| + | CREATE TABLE dokument ( | ||
| + | dokument_id | ||
| + | bewerbung_id | ||
| + | typ | ||
| + | dateipfad | ||
| + | url | ||
| + | erstellt_am_datum DATE NOT NULL, | ||
| + | notizen | ||
| + | erstellt_am | ||
| + | CONSTRAINT fk_dokument_bewerbung | ||
| + | FOREIGN KEY (bewerbung_id) REFERENCES bewerbung(bewerbung_id) | ||
| + | ON DELETE CASCADE, | ||
| + | INDEX idx_dokument_bewerbung_typ (bewerbung_id, | ||
| + | ) ENGINE=InnoDB; | ||
| + | |||
| + | /* ========================================================= | ||
| + | 3) Views (Export / Nachweis / Report) | ||
| + | | ||
| + | |||
| + | CREATE OR REPLACE | ||
| SELECT | SELECT | ||
| - | b.bewerbung_id AS bewerbung_id, | + | |
| - | b.bewerbungsdatum AS bewerbungsdatum, | + | b.bewerbungsdatum, |
| - | f.name AS firma, | + | f.name AS firma, |
| - | s.titel AS stelle, | + | s.titel AS stelle, |
| - | b.kanal AS kanal, | + | b.kanal, |
| - | b.aktueller_status AS status, | + | b.aktueller_status AS status, |
| - | b.naechstes_nachfassen AS naechstes_nachfassen, | + | b.naechstes_nachfassen, |
| - | s.referenznummer AS referenznummer, | + | s.quelle_plattform |
| - | COUNT(d.dokument_id) AS anzahl_belege | + | s.referenznummer, |
| + | s.stellen_url | ||
| FROM bewerbung b | FROM bewerbung b | ||
| JOIN stelle s ON s.stelle_id = b.stelle_id | JOIN stelle s ON s.stelle_id = b.stelle_id | ||
| - | JOIN firma f ON f.firma_id = s.firma_id | + | JOIN firma f ON f.firma_id |
| + | |||
| + | CREATE OR REPLACE VIEW v_nachweis_bewerbungen_mit_belegen AS | ||
| + | SELECT | ||
| + | b.bewerbung_id, | ||
| + | b.bewerbungsdatum, | ||
| + | f.name AS firma, | ||
| + | s.titel AS stelle, | ||
| + | b.kanal, | ||
| + | b.aktueller_status AS status, | ||
| + | b.naechstes_nachfassen, | ||
| + | s.quelle_plattform AS quelle, | ||
| + | s.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 | ||
| LEFT JOIN dokument d ON d.bewerbung_id = b.bewerbung_id | LEFT JOIN dokument d ON d.bewerbung_id = b.bewerbung_id | ||
| GROUP BY | GROUP BY | ||
| - | b.bewerbung_id, | + | |
| - | b.bewerbungsdatum, | + | b.aktueller_status, |
| - | f.name, | + | |
| - | s.titel, | + | |
| - | b.kanal, | + | |
| - | b.aktueller_status, | + | |
| - | b.naechstes_nachfassen, | + | |
| - | s.referenznummer; | + | |
| - | </ | + | |
| - | Hinweise zur DDL | + | CREATE OR REPLACE VIEW v_report_monat AS |
| + | SELECT | ||
| + | DATE_FORMAT(bewerbungsdatum, | ||
| + | COUNT(*) AS bewerbungen_total, | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | SUM(aktueller_status=' | ||
| + | FROM bewerbung | ||
| + | GROUP BY DATE_FORMAT(bewerbungsdatum, | ||
| + | ORDER BY monat DESC; | ||
| - | RESTRICT bei FKs: verhindert versehentliche Loeschungen (amtstauglich = kein Datenverlust). | + | </ |
| - | aktueller_status ist bewusst redundant (Performance + einfache Auswertungen); | + | <WRAP center round box 60%> |
| + | **Hinweise zur DDL | ||
| + | ** | ||
| + | * RESTRICT bei FKs: verhindert versehentliche Loeschungen (amtstauglich = kein Datenverlust). | ||
| + | * aktueller_status ist bewusst redundant (Performance + einfache Auswertungen); | ||
| + | * dokument.dateipfad und dokument.url koennen optional sein; mindestens eines sollte befuellt sein (Validierung macht PHP). | ||
| + | </ | ||
| - | 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