Datenbankmodellierung richtig machen

KI generiertes Symbolbild – tiny-tool.de
Primary Keys, referenzielle Integrität und saubere Beziehungen – strategisch fundiert für IBM i und moderne Backend-Architekturen
Daten überleben Technologien. Wer heute Tabellen modelliert, entscheidet über Integrationsfähigkeit, Wartbarkeit und Migrationskosten der nächsten Jahrzehnte. Dieser Artikel bündelt die wichtigsten Prinzipien guter relationaler Datenmodellierung – mit Fokus auf Db2 for i, Legacy-Modernisierung und langfristiger Architekturqualität (Stand 2026).
Inhaltsverzeichnis
- 1. Einleitung – Datenmodellierung ist Architektur
- 2. Entitäten richtig verstehen
- 3. Primary Key – Identität ≠ Bedeutung
- 4. Systemintegration, Mandantenfähigkeit und Fusion
- 5. Modernisierung bestehender Legacy-Tabellen (IBM i)
- 6. Referenzielle Integrität in die Datenbank
- 7. Beziehungen korrekt modellieren
- 8. Tabelle erweitern oder neue Tabelle?
- 9. Entity-Attribute-Value (EAV) – wann ja, wann nein
- 10. Normalisierung pragmatisch erklärt
- 11. Anti-Patterns im Überblick
- 12. Praktische Checkliste
- 13. Fazit
- Glossar
- Quellen & Weiterführende Ressourcen
1. Einleitung – Datenmodellierung ist Architektur
In vielen IBM-i-Landschaften sind Datenbanken historisch gewachsen: DDS-Dateien, logische Files, keine expliziten Foreign Keys, Integrität ausschließlich im RPG-Code. Solange ein System isoliert arbeitet, „funktioniert“ das oft überraschend lange – die strukturellen Kosten werden erst sichtbar, wenn Integration Realität wird.
Typische Auslöser:
- Ein neues Java- oder .NET-Frontend greift direkt auf Db2 for i zu.
- Ein Data-Warehouse extrahiert periodisch Daten (ETL/ELT).
- Eine Microservice-Architektur wird schrittweise eingeführt.
- Zwei Unternehmen mit eigenem IBM-i-System fusionieren.
- Mandantenfähigkeit wird nachträglich gefordert.
- Externe Services replizieren Daten (CDC, Sync, Integration Hubs).
Sie ist das strukturelle Rückgrat der Systemarchitektur – und meist das langlebigste Artefakt eines Unternehmens.
2. Entitäten richtig verstehen
Eine Entität besitzt eine stabile Identität, einen klar definierten Lebenszyklus und eine eigene fachliche Verantwortung. Tabellen sind lediglich die technische Umsetzung – nicht der Ursprung des Modells.
Lebenszyklus als wichtigstes Entscheidungskriterium
Der entscheidende Test lautet: Hat dieses Objekt einen eigenen, unabhängigen Lebenszyklus?
Beispiel:
- Ein Auftrag wird angelegt, geändert, bestätigt, fakturiert, storniert, archiviert.
- Eine Auftragsposition existiert normalerweise nur im Kontext des Auftrags → sie ist Teil des Aggregats.
CREATE TABLE orders (
id CHAR(36) CCSID 1208 NOT NULL DEFAULT GENERATE_UUID(),
/* ... */
PRIMARY KEY (id)
);
CREATE TABLE order_positions (
id CHAR(36) CCSID 1208 NOT NULL DEFAULT GENERATE_UUID(),
order_id CHAR(36) CCSID 1208 NOT NULL,
/* ... */
PRIMARY KEY (id),
CONSTRAINT fk_positions_order
FOREIGN KEY (order_id) REFERENCES orders(id)
ON DELETE CASCADE
);
Wird eine Position später eigenständig referenziert (z. B. Reklamation, Lagerbeleg, Qualitätssicherung, gesetzliche Aufbewahrung), sollte sie eine eigene Entität mit eigenem Lebenszyklus werden – aber bewusst, mit klarer fachlicher Begründung.
Wer ohne fachliche Abgrenzung Tabellen entwirft, riskiert langfristig unklare Zuständigkeiten und Integrationsprobleme.
3. Primary Key – Identität ≠ Bedeutung
Der Primärschlüssel hat nur eine Aufgabe: dauerhaft eindeutige Identifikation – technisch, stabil, unveränderlich. Er ist kein Anzeigefeld und sollte keine Geschäftsregeln codieren.
Warum „sprechende“ / natürliche Schlüssel langfristig teuer werden
- Fusionen / Carve-outs → Kollisionen in Nummernkreisen
- Mandantenfähigkeit nachträglich → Präfixe oder Komposit-Schlüssel werden „hineingequetscht“
- Änderung von Geschäftsregeln (z. B. Format der Kundennummer) → Kaskadenänderungen in abhängigen Tabellen
- Replikation / CDC / Event-Sourcing → Konflikte bei dezentraler Vergabe
Technische Surrogate Keys reduzieren dieses Risiko deutlich.
Empfohlene Schlüssel-Strategien (praxisnah)
- BIGINT IDENTITY (Db2 for i:
GENERATED ALWAYS AS IDENTITY) – kompakt, performant, ideal für viele Core-Tabellen. - UUID – gut für verteilte Systeme/Offline-Erfassung. Db2 for i kann per
GENERATE_UUID()UUID v4 erzeugen; zeitbasierte UUID v7 müssen (Stand heute) typischerweise in der Anwendung erzeugt werden. - Fachlicher Schlüssel (Kundennr, Artikel-Nr, …) als
UNIQUE+ ggf.CHECK(und bei Bedarf mandantenbezogen). - Komposit-PKs (Mandant + Nummer) nur gezielt einsetzen (z. B. reine Relationstabellen) – nicht als Standard für Kernentitäten.
VARBINARY(16) oft besser als CHAR(36). Du kannst UUIDs im Textformat anzeigen, aber intern kompakt speichern (siehe Beispiel unten).-- Speicherung als VARBINARY(16), Anzeige als CHAR(36):
-- 1) Text (CHAR(36)) -> VARBINARY(16): VARBINARY_FORMAT(...)
-- 2) VARBINARY(16) -> Text (CHAR(36)): VARCHAR_FORMAT_BINARY(...)
CREATE TABLE kunde (
id_bin VARBINARY(16) NOT NULL DEFAULT VARBINARY_FORMAT(GENERATE_UUID(), 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'),
mandant_id SMALLINT NOT NULL,
kundennr VARCHAR(20) NOT NULL,
name1 VARCHAR(70) NOT NULL,
name2 VARCHAR(70),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
rowchg_ts TIMESTAMP NOT NULL GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP,
PRIMARY KEY (id_bin),
CONSTRAINT uq_kunde_mandant UNIQUE (mandant_id, kundennr),
CONSTRAINT chk_kundennr_len CHECK (LENGTH(kundennr) BETWEEN 3 AND 20)
);
ROW CHANGE TIMESTAMP aktualisiert sich bei jedem UPDATE-Statement (auch wenn Werte gleich bleiben). Wenn du „nur bei echter Änderung“ brauchst, nimm einen Trigger mit Vergleichslogik.Beispiel aus einem Fusionsszenario
In einem Integrationsprojekt zweier IBM-i-Systeme mit identischem Kundennummernkreis
mussten abhängige Tabellen temporär um Mandantenkennzeichen erweitert werden,
bevor eine konsolidierte Datenbasis entstehen konnte.
Ein technischer Surrogate Key hätte diesen Zwischenschritt vermieden.
4. Systemintegration, Mandantenfähigkeit und Fusion
Integration, Föderation und Replikation sind der Härtetest jedes Datenmodells. Sobald Daten zwischen Systemen bewegt, konsolidiert oder in Echtzeit synchronisiert werden, zeigt sich, ob Identität stabil ist.
Häufige Integrationsfallen
- Überlappende fachliche Nummernkreise (Kunde 4711 in System A und B).
- Nachträgliche Mandantenfähigkeit → jede FK-Beziehung muss erweitert werden.
- Dezentrale Datenerfassung ohne global eindeutige IDs → Konflikte bei Merge/Sync.
Typisches Praxisproblem in IBM-i-Umgebungen
Logische Files simulieren faktisch Primär- oder Fremdschlüssel, ohne dass deklarative
SQL-Constraints existieren. Sobald externe Tools direkt via SQL arbeiten,
treten Inkonsistenzen sichtbar zutage.
5. Modernisierung bestehender Legacy-Tabellen (IBM i)
Viele klassische DDS-Dateien haben keinen SQL-Primary-Key oder verlassen sich auf implizite Eindeutigkeit über logische Dateien. Eine schrittweise Modernisierung ist möglich – ohne Big-Bang.
Pragmatischer Modernisierungspfad
- Neue technische ID-Spalte hinzufügen (z. B.
BIGINTIdentity oderCHAR(36)UUID). - Bestehende Sätze befüllen (bei UUID: per
GENERATE_UUID()). - Primärschlüssel setzen.
- Alten fachlichen Schlüssel als
UNIQUEabsichern. - Fremdschlüssel schrittweise auf die neue ID umstellen (zuerst in neuen Tabellen/Services).
- Constraints erst nach Datenbereinigung aktivieren/validieren.
-- 1) Spalte hinzufügen
ALTER TABLE kundend ADD COLUMN id CHAR(36) CCSID 1208;
-- 2) Bestehende Datensätze befüllen (nur wo noch NULL)
UPDATE kundend
SET id = GENERATE_UUID()
WHERE id IS NULL;
-- 3) PK setzen
ALTER TABLE kundend
ADD CONSTRAINT pk_kundend PRIMARY KEY (id);
-- 4) Fachlichen Schlüssel sichern (Beispiel)
ALTER TABLE kundend
ADD CONSTRAINT uq_kundend_mandant_kundennr UNIQUE (mandant, kundennr);
Wichtig: Vor dem Setzen von NOT NULL und Constraints Dubletten, NULL-Werte und historische Artefakte bereinigen – sonst scheitert die Aktivierung.
CREATE TABLE … OR REPLACE (hilfreich in Dev/CI, wenn du Strukturen iterativ weiterentwickelst). Für produktive Migrationen bleibt ALTER TABLE meist die sauberere, kontrollierte Route.6. Referenzielle Integrität in die Datenbank
Foreign-Key-Constraints gehören in die Datenbank – nicht nur in die Anwendung. Batch-Jobs, ETL-Prozesse, Reporting-Tools, direkte SQL-Zugriffe und zukünftige Microservices umgehen sonst die Anwendungslogik.
„Dann haben wir die Logik doppelt.“ – Nein.
Ein Foreign Key ist keine Business-Logik, sondern eine strukturelle Invariante:
Ein Kind-Datensatz darf ohne existierenden Parent nicht existieren.
Anwendungscode steuert Verhalten.
Die Datenbank garantiert Struktur.
Ohne Constraint verteilt sich die Prüfung auf mehrere Codepfade – und wird irgendwann vergessen.
Mit Constraint ist sie einmal definiert, global wirksam und nicht umgehbar.
Das ist keine doppelte Logik.
Das ist saubere Architektur.
ALTER TABLE aufpos
ADD CONSTRAINT fk_aufpos_auftrag
FOREIGN KEY (auftrag_id)
REFERENCES aufkopf (id)
ON DELETE CASCADE
ON UPDATE RESTRICT;
| Szenario | Empfohlene Aktion | Begründung |
|---|---|---|
| Kind ist rein abhängig (Positionsdaten) | CASCADE | Kind hat ohne Elternteil keine Existenzberechtigung |
| Kind hat eigene Bedeutung / Revisionspflicht | RESTRICT / NO ACTION | Verhindert versehentliches Löschen des Elternsatzes |
| Aufbewahrungspflicht / Audit | RESTRICT + Soft-Delete | Logisches Löschen + Archiv-/Purge-Strategie |
Deklarative Constraints in der Datenbank bilden daher die verlässlichste Absicherung gegen Inkonsistenzen.
7. Beziehungen korrekt modellieren
1:n – Klassischer Fall
Ein Kunde hat mehrere Aufträge.
kundend (id PK)
aufkopf (id PK, kunde_id FK → kundend.id)
m:n – in der Praxis selten „nur“ eine Kreuztabelle
In der Realität hat die Verbindungstabelle fast immer eigene Attribute (Menge, Preis zum Zeitpunkt, Rabatt, Status, Positionsnummer, …) und wird damit selbst zur Entität.
CREATE TABLE auftrag_position (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
auftrag_id BIGINT NOT NULL,
artikel_id BIGINT NOT NULL,
positionsnr INTEGER NOT NULL,
menge DECIMAL(11,3) NOT NULL,
vk_preis DECIMAL(12,4) NOT NULL,
rabatt_prozent DECIMAL(5,2) NOT NULL DEFAULT 0,
status CHAR(1) NOT NULL DEFAULT 'O', -- O=offen, L=geliefert, R=retour ...
CONSTRAINT fk_pos_auftrag FOREIGN KEY (auftrag_id) REFERENCES aufkopf(id) ON DELETE CASCADE,
CONSTRAINT fk_pos_artikel FOREIGN KEY (artikel_id) REFERENCES artikel(id) ON DELETE RESTRICT,
CONSTRAINT uq_posnr UNIQUE (auftrag_id, positionsnr),
CONSTRAINT chk_menge_pos CHECK (menge > 0)
);
8. Tabelle erweitern oder neue Tabelle?
| Frage | Wenn Ja | Wenn Nein |
|---|---|---|
| Hat das Objekt einen eigenen Lebenszyklus? | → Neue Tabelle | → Spalte |
| Kann es mehrfach vorkommen (1:n)? | → Neue Tabelle | → Spalte |
| Muss es historisiert werden? | → Neue Tabelle | → Spalte (ggf. mit von/bis) |
| Wird es von anderen Tabellen direkt referenziert? | → Neue Tabelle | → Spalte |
| Ist es optional / sehr selten gefüllt? | → eigene Tabelle oder JSON (nur für Zusatzfelder) | → Spalte |
Faustregel: Sobald Wiederholung, Historisierung, externe Referenzen oder eigener Lebenszyklus ins Spiel kommen → neue Tabelle.
9. Entity-Attribute-Value (EAV) – wann ja, wann nein
EAV speichert Attribute zeilenweise statt spaltenweise. Das verschiebt Struktur in die Daten – mit spürbaren Folgen für Typisierung, Constraints, Abfragekomplexität und Performance.
CREATE TABLE artikel_eav (
artikel_id BIGINT NOT NULL,
attribut VARCHAR(80) NOT NULL,
wert VARCHAR(4000),
PRIMARY KEY (artikel_id, attribut)
);
Warum EAV im Kerndatenbereich fast immer weh tut
- Typverlust: alles wird Text (oder CLOB) → Sortierung, Vergleiche, Aggregationen werden unsauber oder teuer.
- Keine saubere Validierung pro Attribut:
NOT NULL,CHECK,FOREIGN KEYsind nur noch schwer/indirekt möglich. - Abfragen werden kompliziert: Self-Joins oder Pivot-Logik (
MAX(CASE ...)) statt einfacher Spaltenzugriffe. - Indexes werden ineffizient: viele Zugriffe landen auf (entity, attribut) und müssen dann Werte filtern/casten.
- BI/Reporting eskaliert: Jede neue Kennzahl wird zum Modellierungsprojekt.
Für zentrale Geschäftsobjekte ist ein relational strukturiertes Modell in den meisten Fällen langfristig stabiler.
Wann EAV (oder eine kontrollierte Variante) vertretbar ist
- Sehr große Anzahl potenzieller Attribute (z. B. Produktkonfiguratoren, Custom Fields in SaaS).
- Die meisten Attribute sind bei den meisten Entitäten leer.
- Attribute werden vom Endkunden selbst definiert.
- Performance-Anforderungen sind moderat oder es gibt gezielte Materialisierungen/Views für Reporting.
Wenn schon EAV, dann bitte „kontrolliert“
Ein praxistauglicher Ansatz ist: Metadaten + typisierte Werte. Damit kannst du zumindest Typen/Validierung und saubere Indizes abbilden.
CREATE TABLE attribut_def (
attribut_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
attribut_key VARCHAR(80) NOT NULL,
datentyp CHAR(1) NOT NULL, -- 'S'tring, 'N'umeric, 'D'ate/'T'imestamp, 'B'oolean ...
required SMALLINT NOT NULL DEFAULT 0,
allowed_regex VARCHAR(200),
CONSTRAINT uq_attr_key UNIQUE (attribut_key),
CONSTRAINT chk_datentyp CHECK (datentyp IN ('S','N','T','B'))
);
CREATE TABLE artikel_attr (
artikel_id BIGINT NOT NULL,
attribut_id BIGINT NOT NULL,
val_s VARCHAR(4000),
val_n DECIMAL(31,10),
val_ts TIMESTAMP,
val_b SMALLINT,
PRIMARY KEY (artikel_id, attribut_id),
CONSTRAINT fk_attr_def FOREIGN KEY (attribut_id) REFERENCES attribut_def(attribut_id),
CONSTRAINT chk_one_val CHECK (
(CASE WHEN val_s IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN val_n IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN val_ts IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN val_b IS NULL THEN 0 ELSE 1 END)
= 1
)
);
-- Für Performance: Indexe nach typischen Filterpfaden (z. B. attribut_id + val_n, attribut_id + val_s, ...)
SELECT
e.artikel_id,
MAX(CASE WHEN d.attribut_key = 'Farbe' THEN e.val_s END) AS farbe,
MAX(CASE WHEN d.attribut_key = 'Groesse' THEN e.val_s END) AS groesse,
MAX(CASE WHEN d.attribut_key = 'Gewicht' THEN e.val_n END) AS gewicht
FROM artikel_attr e
JOIN attribut_def d ON d.attribut_id = e.attribut_id
GROUP BY e.artikel_id;
10. Normalisierung pragmatisch erklärt
Normalisierung reduziert Redundanz und verhindert Update-Anomalien – besonders wichtig bei Stammdaten.
auftrag (
aufnr,
kundennr,
kundenname,
kundenstrasse,
kundenplz,
kundenort,
...
)
Adressänderung muss in allen Aufträgen des Kunden nachgezogen werden → fehleranfällig.
Normalformen kurz & pragmatisch:
- 1NF – atomare Werte, keine wiederholenden Gruppen
- 2NF – keine Teilabhängigkeiten vom Schlüssel
- 3NF / BCNF – keine transitiven Abhängigkeiten
- 4NF / 5NF – meist nur bei sehr komplexen m:n-Beziehungen relevant
11. Anti-Patterns im Überblick
- Sprechende Primärschlüssel als Standard
VARCHAR(5000)oder CLOB für alles (fehlende Typisierung)- Komma-separierte Listen oder JSON als Ersatz für relationale Kernstruktur
- NULL als „leer“, „nicht zutreffend“, „0“-Ersatz ohne klare Semantik
- Historisierung ohne von/bis oder Versionsmodell
- Status-Flags als
CHAR(1)ohneCHECKoder Lookup - Spalte1 … Spalte10 („repeating groups“)
- Integrität nur in RPG/Java/.NET – nicht deklarativ in der DB
- Soft-Delete ohne Archivierungs-/Purging-Strategie
- EAV für Kerndaten statt strukturierter Modellierung
ALTER TABLE aufkopf
ADD CONSTRAINT chk_status
CHECK (status IN ('O','B','F','S')); -- offen, bestätigt, fakturiert, storniert
12. Praktische Checkliste
- Jede Kernentität hat einen technischen, stabilen Primärschlüssel (Identity oder UUID)?
- Fachliche Schlüssel sind als UNIQUE-Constraint (ggf. mandantenbezogen) gesichert?
- Alle wichtigen Beziehungen haben deklarative FOREIGN KEY Constraints?
- ON DELETE / ON UPDATE Strategie ist bewusst gewählt und dokumentiert?
- Keine kommagetrennten Listen oder JSON als Ersatz für relationale Struktur?
- Historisierung / Audit-Trail / Gültigkeitszeiträume sind geklärt?
- Statuswerte sind via CHECK oder Lookup validiert?
- Mandantenfähigkeit ist als separates Attribut modelliert (und nicht „in den PK gequetscht“)?
- EAV wird nur für echte Customizing-Fälle genutzt – nicht für Kerndaten?
- NOT NULL wird konsequent eingesetzt, wo sinnvoll?
13. Fazit
Gute Datenmodellierung ist strategische Architekturarbeit – besonders auf IBM i, wo Datenmodelle oft 20-30 Jahre und mehrere Technologiegenerationen überleben.
Wer technische Identität von fachlicher Bedeutung trennt, referenzielle Integrität deklarativ nutzt, Beziehungen sauber modelliert und Anti-Patterns vermeidet, spart in den nächsten 10-15 Jahren enorme Integrations-, Migrations- und Wartungskosten.
Gute Modelle sind nicht „schön“ – sie sind stabil, erweiterbar, integrationsfreundlich und überleben Frameworks, Programmiersprachen und Architekturtrends.
Glossar – zentrale Begriffe der relationalen Modellierung
Kurzer Spickzettel – ideal zum schnellen Nachschlagen.
- Entität
- Ein fachliches Konzept oder reales Geschäftobjekt mit stabiler, eindeutiger und dauerhafter Identität sowie einem eigenen, unabhängigen Lebenszyklus (Erfassung / Creation, Änderung, Statuswechsel, (logische/physische) Löschung oder Archivierung). Beispiele: Kunde, Lieferant, Auftragskopf, Auftragsposition, Artikel, Rechnung, Lagerort, Mitarbeiter, Vertrag. Entitäten sind der fachliche Kern jeder guten Datenmodellierung. Tabellen sind lediglich die technische Repräsentation. Wer Entitätsgrenzen unsauber zieht, erzeugt langfristig hohe Integrations-, Migrations- und Wartungskosten.
- Surrogate Key
- Technischer, künstlicher, bedeutungsloser Primärschlüssel (meist
BIGINT GENERATED ALWAYS AS IDENTITYoderUUID). Seine einzige Aufgabe ist die systemweite, kollisionssichere, unveränderliche und stabile Identifikation eines Datensatzes – unabhängig von Geschäftsregeln, Nummernkreisen oder Organisationsstrukturen. Surrogate Keys sind essenziell für Mandantenfähigkeit, Systemfusionen, Replikation (CDC), Microservices, Event-Sourcing und verteilte Systeme. Sie verhindern die meisten späteren teuren Strukturbrüche. - Business Key / Natural Key / Fachlicher Schlüssel
- Der im fachlichen / geschäftlichen Kontext verwendete, für Menschen sprechende und oft ausgedruckte Schlüssel (Kundennummer „K-004712“, Artikelnummer „ZAP-784-XL“, Rechnungsnummer „RE-2026-4289“, Personalnummer „P-8374“). Er dient der Kommunikation mit Anwendern, Ausdrucken, Schnittstellen und Legacy-Systemen. Sollte immer als
UNIQUE-Constraint (meist mandantenbezogen) gesichert werden, aber nur in sehr seltenen, historisch stabilen Einzelsystemen als Primärschlüssel verwendet werden – sonst drohen bei Regeländerungen, Fusionen, Mandantentrennung oder Replikation massive Kaskadenanpassungen. - Primary Key (PK)
- Der eindeutige, nicht-NULL Schlüssel einer Tabelle. Muss drei Kernanforderungen erfüllen: eindeutig (keine Duplikate), stabil (darf nie geändert werden), minimal (keine überflüssigen Spalten). In modernen, integrationsorientierten Architekturen fast immer ein Surrogate Key. Fachliche Schlüssel als PK sind nur dann vertretbar, wenn sie garantiert unveränderlich und global eindeutig sind (was in der Praxis extrem selten der Fall ist).
- Foreign Key (FK) / Referential Constraint
- Deklarative Integritätsregel der Datenbank, die sicherstellt, dass ein Wert in einer abhängigen Tabelle (Child/FK-Spalte) immer auf einen existierenden Wert in der referenzierten Tabelle (Parent, meist deren PK) verweist. Verhindert Inkonsistenzen („verwaiste“ Datensätze) – und das nicht nur in der Anwendung, sondern auch bei Batch-Verarbeitung, ETL/ELT, Reporting-Tools, direkten SQL-Zugriffen und zukünftigen Services. Mit
ON DELETE CASCADE / RESTRICT / SET NULL / NO ACTIONundON UPDATElässt sich das Verhalten bei Änderung/Löschung des Elternsatzes präzise steuern. - Aggregat
- Begriff aus Domain-driven Design (DDD): Eine Cluster von Entitäten und Value Objects, die als konsistente Einheit behandelt und in einer Transaktion gemeinsam geändert werden. Der Aggregate Root (meist die Haupttabelle) ist der einzige Einstiegspunkt. Beispiel: Auftragskopf (Root) + Auftragspositionen + ggf. Lieferadresse zum Zeitpunkt. Innerhalb eines Aggregats gilt starke Konsistenz, zwischen Aggregaten eventual consistency. Hilft, fachliche Grenzen sauber zu ziehen und unnötige Joins zu vermeiden.
- EAV (Entity-Attribute-Value)
- Speichermuster, bei dem Attribute nicht als feste Spalten, sondern zeilenweise als Schlüssel-Wert-Paare abgelegt werden (meist entity_id, attribut_name, wert). Für Kerndaten (Kunde, Auftrag, Artikel, Rechnung, Lagerbewegungen …) fast immer ein schwerwiegendes Anti-Pattern wegen Typverlust, fehlender deklarativer Constraints, sehr komplexer Abfragen, schlechter Indexnutzung und katastrophaler BI-/Reporting-Fähigkeit. Nur in speziellen Szenarien (Endbenutzer-Customizing mit hunderten potenziellen Feldern, sehr sparse Daten) vertretbar – und dann idealerweise mit Metadaten-Tabelle + typisierten Spalten (val_string, val_number, val_timestamp, val_boolean) kontrolliert umgesetzt.
- Soft Delete
- Logisches Löschen durch Setzen eines Flags (z. B.
deleted_at TIMESTAMP WITH DEFAULT NULLoderis_deleted SMALLINT DEFAULT 0) statt physischemDELETE. Ermöglicht Wiederherstellung, Audit-Nachverfolgung und gesetzliche Aufbewahrungspflichten. Muss zwingend mit einer klaren Archivierungs- und Purge-Strategie kombiniert werden, sonst wachsen Tabellen unkontrolliert. Foreign Keys und Abfragen müssen angepasst werden (meist via Views oderON DELETE RESTRICT+ Soft-Delete-Logik). - ROW CHANGE TIMESTAMP
- Db2 for i Feature (
GENERATED ALWAYS FOR EACH ROW ON UPDATE AS ROW CHANGE TIMESTAMP): Automatischer systemseitiger Zeitstempel, der sich bei jedemUPDATE-Statement aktualisiert – unabhängig davon, ob sich ein Wert tatsächlich geändert hat. Sehr nützlich für Change-Data-Capture (CDC), Replikation, Delta-Extraktion, Event-Sourcing und optimistisches Locking. Nicht gleichbedeutend mit „echter fachlicher Änderung“ – dafür benötigt man meist einen Trigger mit Vorher-Nachher-Vergleich oder eine separatelast_meaningful_change_ts-Spalte. - Normalisierung
- Regelwerk (1NF bis 5NF) zur systematischen Beseitigung von Redundanz und Vermeidung von Insert-, Update- und Delete-Anomalien. In der Praxis ist für Stammdaten (Kunde, Artikel, Lieferant, Mitarbeiter …) meist 3. Normalform (3NF) das realistische und sinnvolle Ziel. Bei Bewegungsdaten und Reporting-Tabellen wird oft bewusst und dokumentiert denormalisiert, um Performance und Abfragekomplexität zu verbessern. 4NF und 5NF sind in den meisten ERP-, CRM- und Branchenlösungen nur in Ausnahmefällen relevant.
- Db2 for i / IBM i
- Das relationale Datenbanksystem auf IBM i (früher AS/400). Db2 for i ist eng ins Betriebssystem integriert und unterstützt SQL, Constraints, Trigger, Views und moderne Features wie Identity-Spalten, Generated Columns und systemseitige Zeitstempel.
- DDS
- Data Description Specifications: klassische IBM-i-Definition von physischen/logischen Files außerhalb von SQL. Historisch verbreitet; für moderne Modellierung, Constraints und Tooling ist SQL-DDL in der Regel die robustere Basis.
- Logische Files
- IBM-i-Objekte, die Indizes/Sichten über physische Files abbilden (vergleichbar mit Views/Indexes). Sie können Eindeutigkeit “simulieren”, ersetzen aber keine deklarativen PK/FK-Constraints.
- RPG
- Programmiersprache im IBM-i-Umfeld. In vielen Legacy-Systemen wird Datenintegrität traditionell im RPG-Code implementiert – was bei direkten SQL-Zugriffen oder Integration schnell löchrig wird.
- ETL / ELT
- Datenintegration ins Data-Warehouse: ETL = Extract–Transform–Load (Transformation vor dem Laden), ELT = Extract–Load–Transform (Transformation nach dem Laden, z. B. im DWH). Beide umgehen oft Anwendungslogik und brauchen daher robuste DB-Constraints.
- Replikation
- Synchronisation von Daten zwischen Systemen, z. B. von einem Quellsystem (ERP) zu einem Zielsystem (Reporting, DWH, Integrationsplattform). Replikation kann batch-basiert (z. B. nächtliche Jobs) oder kontinuierlich erfolgen (z. B. via CDC). Wichtig: Replikation ersetzt keine Datenmodellierung – sie verstärkt Modellfehler nur schneller.
- CDC
- Change Data Capture: Verfahren, um Datenänderungen (Insert/Update/Delete) zuverlässig zu erkennen und weiterzugeben (z. B. Replikation, Integration Hubs, Delta-Extraktion).
- Event-Sourcing
- Architekturansatz, bei dem Änderungen als unveränderliche Ereignisse gespeichert werden. Aktueller Zustand entsteht durch das Abspielen der Events; benötigt klare Identität und konsistente Integritätsregeln.
- Microservices
- Architekturstil mit vielen kleinen, unabhängig deploybaren Services. Macht stabile IDs, klare Datenverträge und Integrität besonders wichtig, weil mehr Schnittstellen und Datenflüsse entstehen.
- Mandantenfähigkeit
- Mehrere Kunden/Organisationseinheiten (Mandanten) teilen sich ein System. Wird sie nachträglich eingeführt, beeinflusst das Schlüssel, Unique-Regeln und nahezu jede Beziehung im Datenmodell.
- Carve-out
- Abspaltung/Teilverkauf eines Geschäftsbereichs. Daten müssen selektiv extrahiert, bereinigt und in ein Zielsystem überführt werden – mit hohem Risiko für Schlüsselkonflikte.
- UNIQUE-Constraint
- Datenbankregel, die Eindeutigkeit über eine oder mehrere Spalten erzwingt (z. B. mandant_id + kundennr). Ideal, um Business Keys zu sichern, ohne sie als Primary Key zu missbrauchen.
- CHECK-Constraint
- Datenbankregel, die Wertebereiche/Patterns erzwingt (z. B. status IN (‚O‘,’B‘,’F‘,’S‘) oder menge > 0). Macht Datenqualität deklarativ und global wirksam.
- ON DELETE CASCADE / RESTRICT / NO ACTION
- FK-Optionen: CASCADE löscht abhängige Kindzeilen automatisch mit; RESTRICT/NO ACTION verhindern das Löschen, wenn Kinder existieren. Die Wahl ist eine bewusste Geschäfts-/Audit-Entscheidung.
- Trigger
- DB-Logik, die bei INSERT/UPDATE/DELETE automatisch ausgeführt wird. Nützlich für Auditing oder “echte Änderungszeitpunkte”, sollte aber gezielt und nachvollziehbar eingesetzt werden.
- View
- Virtuelle Tabelle basierend auf einer Query. Hilft bei Abstraktion (z. B. Soft-Delete filtern) und kann ein stabiles Interface für Reporting/Integration schaffen.
- Denormalisierung
- Bewusstes Zulassen von Redundanz (z. B. für Reporting/Performance). Sollte begründet, dokumentiert und mit klarer Update-Strategie umgesetzt werden.
- BCNF
- Boyce–Codd Normalform: stärkere Variante der 3NF, die bestimmte Anomalien verhindert. In der Praxis relevant bei komplexeren funktionalen Abhängigkeiten.
- Pivot (MAX/CASE)
- Technik, um zeilenbasierte Attribute (z. B. EAV) in Spaltenform zu drehen, häufig via MAX(CASE WHEN …). Funktioniert, ist aber wartungs- und performance-intensiver als echte Spalten.
- CLOB
- Character Large Object: Datentyp für sehr große Textmengen. Für unstrukturierte Inhalte ok, aber als “Universaltyp” in Kerndaten ein Anti-Pattern, weil Typisierung/Constraints verloren gehen.
- UUID (v4/v7)
- Universally Unique Identifier. v4 ist zufällig; v7 ist zeitbasiert und index-freundlicher. Db2 for i liefert per GENERATE_UUID() typischerweise UUID v4; v7 wird häufig in der Anwendung erzeugt.
Quellen & Weiterführende Ressourcen
- IBM i 7.5 SQL Reference (Online)
- Db2 for i: GENERATE_UUID()
- Db2 for i: Referential Constraints
- Db2 for i: CREATE TABLE … OR REPLACE
- Martin Fowler: Patterns of Enterprise Application Architecture (Catalog)
- E. F. Codd (1970): A Relational Model of Data for Large Shared Data Banks (ACM DOI)
- PostgreSQL: Constraints (gute Vergleichslektüre)
- RFC 9562: UUIDs (inkl. Version 7)



tiny-tool.de
tiny-tool.de