Datenmodell-Schulungskonsole

Interaktive Schulungsoberfläche für relationale Normalisierung in SQL und flexible Dokumentmodelle in MongoDB.

SQL + MongoDB
Dokumente & Events
MongoDB-Track · Schritt 1 / 5

Dokument-Import

Dieser Lernpfad zeigt, welche Daten nach der SQL-Normalisierung bewusst in flexible Dokumente ausgelagert werden: variierende Produktattribute, Interaktionsprofile und Event-Historien.

Dokumentenfluss aktiv
Schritt 1: Dokument-Import — Nach der SQL-Normalisierung werden Daten ergänzt, die sich ständig ändern oder je Datensatz unterschiedlich aussehen. Dafür liegen drei Collections als NDJSON in MongoDB: Produktdetails, Kundeninteraktionen und Bestellereignisse.
500
Produktdetails
150
Kundeninteraktionen
200
Bestellereignisse

Aktive Collection: Bestellereignisse — jeweils mit verschachtelten Objekten und Arrays statt festem Spaltenschema.

B-20240001

{
    "_id": {
        "$oid": "69c16cff1e2291a8384747cf"
    },
    "bestellnummer": "B-20240001",
    "kundennummer": "K106",
    "status_snapshot": "offen",
    "gesamtpreis": 7917.83,
    "ereignisse": [
        {
            "zeitpunkt": "2025-11-16T16:10:00Z",
            "typ": "erstellt",
            "quelle": "ERP"
        },
        {
            "zeitpunkt": "2025-11-16T18:40:00Z",
            "typ": "bezahlt",
            "quelle": "Backoffice",
            "zahlung": {
                "art": "PayPal",
                "transaktions_id": "TX-636112"
            }
        },
        {
            "zeitpunkt": "2025-11-16T20:29:00Z",
            "typ": "kommissioniert",
            "quelle": "Backoffice"
        },
        {
            "zeitpunkt": "2025-11-17T22:58:00Z",
            "typ": "verpackt",
            "quelle": "Backoffice"
        }
    ],
    "fulfillment": {
        "kanal": "Webshop",
        "lager": "Leipzig",
        "prioritaet": "express"
    },
    "pruefungen": {
        "betrugs_score": 88,
        "manuelle_pruefung": false,
        "bemerkung": "Achtung: Sperrgut"
    }
}

B-20240003

{
    "_id": {
        "$oid": "69c16cff1e2291a8384747d1"
    },
    "bestellnummer": "B-20240003",
    "kundennummer": "K52",
    "status_snapshot": "geliefert",
    "gesamtpreis": 447.9,
    "ereignisse": [
        {
            "zeitpunkt": "2024-09-26T09:00:00Z",
            "typ": "erstellt",
            "quelle": "Logistik"
        },
        {
            "zeitpunkt": "2024-09-26T11:08:00Z",
            "typ": "bezahlt",
            "quelle": "Webshop",
            "zahlung": {
                "art": "Nachnahme",
                "transaktions_id": "TX-167164"
            }
        },
        {
            "zeitpunkt": "2024-09-26T13:39:00Z",
            "typ": "kommissioniert",
            "quelle": "Logistik"
        },
        {
            "zeitpunkt": "2024-09-27T15:54:00Z",
            "typ": "verpackt",
            "quelle": "Webshop"
        },
        {
            "zeitpunkt": "2024-09-27T17:35:00Z",
            "typ": "versendet",
            "quelle": "ERP",
            "versand": {
                "dienstleister": "DPD",
                "trackingnummer": "005233027617426345"
            }
        },
        {
            "zeitpunkt": "2024-09-27T19:16:00Z",
            "typ": "zugestellt",
            "quelle": "Webshop",
            "zustellung": {
                "empfangen_von": "Nachbar",
                "erfolgreich": true
            }
        }
    ],
    "fulfillment": {
        "kanal": "Telefonverkauf",
        "lager": "Köln",
        "prioritaet": "express"
    },
    "pruefungen": {
        "betrugs_score": 79,
        "manuelle_pruefung": false,
        "bemerkung": "Stammkunde - Rabatt 10%"
    }
}

B-20240004

{
    "_id": {
        "$oid": "69c16cff1e2291a8384747c2"
    },
    "bestellnummer": "B-20240004",
    "kundennummer": "K85",
    "status_snapshot": "versendet",
    "gesamtpreis": 3495.69,
    "ereignisse": [
        {
            "zeitpunkt": "2026-01-03T13:48:00Z",
            "typ": "erstellt",
            "quelle": "Backoffice"
        },
        {
            "zeitpunkt": "2026-01-03T15:40:00Z",
            "typ": "bezahlt",
            "quelle": "Logistik",
            "zahlung": {
                "art": "Rechnung",
                "transaktions_id": "TX-442094"
            }
        },
        {
            "zeitpunkt": "2026-01-03T17:04:00Z",
            "typ": "kommissioniert",
            "quelle": "Backoffice"
        },
        {
            "zeitpunkt": "2026-01-04T19:39:00Z",
            "typ": "verpackt",
            "quelle": "ERP"
        },
        {
            "zeitpunkt": "2026-01-04T21:22:00Z",
            "typ": "versendet",
            "quelle": "ERP",
            "versand": {
                "dienstleister": "DHL",
                "trackingnummer": "007389479756980870"
            }
        }
    ],
    "fulfillment": {
        "kanal": "Webshop",
        "lager": "Leipzig",
        "prioritaet": "express"
    },
    "pruefungen": {
        "betrugs_score": 11,
        "manuelle_pruefung": true,
        "bemerkung": ""
    }
}

B-20240007

{
    "_id": {
        "$oid": "69c16cff1e2291a8384747ce"
    },
    "bestellnummer": "B-20240007",
    "kundennummer": "K124",
    "status_snapshot": "storniert",
    "gesamtpreis": 10384.44,
    "ereignisse": [
        {
            "zeitpunkt": "2025-05-21T10:36:00Z",
            "typ": "erstellt",
            "quelle": "Webshop"
        },
        {
            "zeitpunkt": "2025-05-21T12:27:00Z",
            "typ": "bezahlt",
            "quelle": "Backoffice",
            "zahlung": {
                "art": "Rechnung",
                "transaktions_id": "TX-990682"
            }
        },
        {
            "zeitpunkt": "2025-05-21T14:35:00Z",
            "typ": "storniert",
            "quelle": "Webshop",
            "grund": "Bestand nicht verfügbar"
        }
    ],
    "fulfillment": {
        "kanal": "Webshop",
        "lager": "Hamburg",
        "prioritaet": "sperrgut"
    },
    "pruefungen": {
        "betrugs_score": 51,
        "manuelle_pruefung": true,
        "bemerkung": "2. Zustellversuch"
    }
}

Warum diese Daten nicht gut in die SQL-Tabellen passen

Variierende Attribute pro Produktkategorie

Elektronik braucht technische Daten, Kleidung Größen und Farben, Lebensmittel Zutaten und Allergene. Ein starres SQL-Schema würde viele Null-Spalten oder zusätzliche Nebentabellen erzeugen.

Profile mit Arrays und Momentaufnahmen

Suchhistorien, Wunschlisten, genutzte Geräte und Kampagnenreaktionen sind pro Kunde unterschiedlich lang und ändern sich häufig.

Event-Streams statt fester Statusspalten

Eine Bestellung hat nicht nur einen Status, sondern eine Folge von Ereignissen mit verschiedenen Zusatzdaten wie Trackingnummern oder Zahlungsdetails.