Datenbankmodellierung richtig machen

Modernes IT-Magazin-Beitragsbild zum Thema „Datenbankmodellierung richtig machen“ mit leuchtenden Datenbank-Stacks, verbundenen Tabellenstrukturen und tiny-tool.de-Branding im oberen Bereich.

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).

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).
Die Datenbank ist kein Speichercontainer.
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.
Beispiel: Aggregat mit Root (orders) und Child (order_positions) inkl. FK + CASCADE

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.

Das fachliche Modell kommt zuerst – Tabellen sind dessen technische Umsetzung.
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
Fachliche Schlüssel können in Integrations-, Mandanten- oder Fusionsszenarien erheblichen Abstimmungs- und Migrationsaufwand verursachen.
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.
UUID-Storage-Tipp (Db2 for i): Für Performance und Index-Größe ist VARBINARY(16) oft besser als CHAR(36). Du kannst UUIDs im Textformat anzeigen, aber intern kompakt speichern (siehe Beispiel unten).
Beispiel: UUID effizient speichern (VARBINARY(16)) und als Text anzeigen

-- 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)
);
Wichtig: 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.
Stabile technische IDs (Identity oder UUID) verhindern die meisten Integrationskonflikte – ohne Umnummerierungsprojekte.

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

  1. Neue technische ID-Spalte hinzufügen (z. B. BIGINT Identity oder CHAR(36) UUID).
  2. Bestehende Sätze befüllen (bei UUID: per GENERATE_UUID()).
  3. Primärschlüssel setzen.
  4. Alten fachlichen Schlüssel als UNIQUE absichern.
  5. Fremdschlüssel schrittweise auf die neue ID umstellen (zuerst in neuen Tabellen/Services).
  6. Constraints erst nach Datenbereinigung aktivieren/validieren.
Migration: Technische UUID-ID nachrüsten + PK/UNIQUE sauber aktivieren

-- 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.

Hinweis: In aktuellen Db2-for-i-Releases gibt es auch 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.

Beispiel: FK-Constraint mit ON DELETE CASCADE und ON UPDATE RESTRICT

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
Integritätsregeln, die ausschließlich in der Anwendung implementiert sind, greifen nicht bei direkten SQL-Zugriffen, ETL-Prozessen oder neuen Services.
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.

Beispiel: 1:n-Beziehung (Kunde → Auftrag) als PK/FK-Modell

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.

Beispiel: m:n auflösen über Positions-Entität (Auftrag ↔ Artikel)

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)
);
❌ Mehrere Werte in einer Spalte („1,7,42“ oder JSON-Array) sind keine relationale Lösung für Kerndaten.

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.

Beispiel: Minimaler EAV-Ansatz (klassisch) – warum er schnell problematisch wird

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 KEY sind 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.
In der Fachliteratur wird EAV für Kerndaten häufig kritisch bewertet.
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.

Beispiel: Kontrolliertes EAV mit Metadaten + typisierten Spalten + CHECK

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, ...)
Alternative (oft besser): die 20-40 wichtigsten Attribute relational (eigene Spalten), seltene Zusatzfelder in JSON, plus gezielte Views/Materialisierungen fürs Reporting.
Beispiel: Reporting-Pivot bei EAV (MAX/CASE) – warum BI dadurch teurer wird

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.

Beispiel: Denormalisiertes Auftragsmodell – typische Update-Anomalie

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
Realistisches Ziel in vielen ERP-/Branchenlösungen: 3NF für Stammdaten, pragmatische Denormalisierung für ausgewählte Bewegungsdaten (Performance, Reporting) – aber bewusst und dokumentiert.

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) ohne CHECK oder 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
Beispiel: Statuswerte per CHECK-Constraint sauber absichern

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 IDENTITY oder UUID). 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 ACTION und ON UPDATE lä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 NULL oder is_deleted SMALLINT DEFAULT 0) statt physischem DELETE. 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 oder ON 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 jedem UPDATE-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 separate last_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.

🔎
Transparenzhinweis:
Die Inhalte auf tiny-tool.de werden sorgfältig recherchiert, redaktionell geprüft und regelmäßig aktualisiert. Quellen und Zitate werden nachvollziehbar angegeben. Dennoch übernehmen wir keine Garantie für Richtigkeit, Vollständigkeit oder Aktualität der bereitgestellten Informationen. Irrtümer sind nicht ausgeschlossen.

Urheber & redaktionelle Unterstützung: Texte auf tiny-tool.de sind geistige Werke der Redaktion (Endredaktion: Guido Zeuner). Digitale Werkzeuge – darunter auch KI-basierte Hilfsmittel – kommen lediglich als Assistenzsysteme bei Recherche, Struktur oder Sprachoptimierung zum Einsatz. Auswahl der Inhalte, Struktur, Argumentation und finale Textfassung stammen von uns als natürlichen Personen; KI-Systeme sind keine Urheber.

Reichweitenmessung (VG Wort / METIS): Zur Ermittlung der Textreichweite werden Zählmarken der VG Wort eingesetzt. Aus technischen Gründen werden diese beim Aufruf der Seite geladen und können derzeit nicht über das Cookie-Banner blockiert werden, da keine Cookies gesetzt werden. Die Messung dient ausschließlich der Reichweitenstatistik; personenbezogene Profile werden nicht erstellt. Mehr dazu in unseren Datenschutzhinweisen.

Bitte beachte: Die Inhalte dienen ausschließlich der allgemeinen Information und stellen keine fachliche Beratung (z. B. rechtlicher, steuerlicher oder finanzieller Art) dar. Die Nutzung der Inhalte erfolgt auf eigene Verantwortung. Eine Haftung für Schäden materieller oder immaterieller Art ist ausgeschlossen, sofern kein vorsätzliches oder grob fahrlässiges Verschulden vorliegt.

Werbung & Affiliate-Links: Einige Beiträge enthalten werbliche Hinweise oder sogenannte Affiliate-Links. Diese sind entsprechend gekennzeichnet. Beim Klick entstehen dir keine zusätzlichen Kosten – wir erhalten ggf. eine kleine Provision.

Markenrechtlicher Hinweis: Alle Markennamen, Logos und Produktbezeichnungen sind Eigentum der jeweiligen Rechteinhaber und werden nur zur identifizierenden Beschreibung verwendet. Es besteht keinerlei Verbindung zu den genannten Unternehmen.

Externe Links: Diese Website enthält Verweise auf externe Websites Dritter. Trotz sorgfältiger Prüfung übernehmen wir keine Verantwortung für deren Inhalte. Bei Bekanntwerden rechtswidriger Inhalte entfernen wir entsprechende Links umgehend.