Zum Abschluss unserer Serie setzen wir alle bisherigen Konzepte zu einem kompletten Beispielprojekt zusammen: eine kleine Datenbank für einen Online-Shop.
Dabei nutzen wir Primär- & Fremdschlüssel, 1:n- und n:m-Beziehungen, Indexe, Views und Transaktionen.

🔹 Projektidee: Mini-Shop

  • Kunden können sich registrieren.
  • Produkte werden im Shop angeboten.
  • Kunden legen Bestellungen an (1:n-Beziehung).
  • Eine Bestellung enthält mehrere Produkte (n:m-Beziehung über Zwischentabelle).

🔹 Datenbank vorbereiten

Falls noch nicht geschehen:

CREATE DATABASE shopdb;
USE shopdb;

🔹 Tabellen anlegen

Kunden

CREATE TABLE kunden (
    id INT AUTO_INCREMENT PRIMARY KEY,
    vorname VARCHAR(50) NOT NULL,
    nachname VARCHAR(50) NOT NULL,
    email VARCHAR(120) NOT NULL UNIQUE,
    erstellt_am DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Produkte

CREATE TABLE produkte (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    preis DECIMAL(10,2) NOT NULL,
    lagerbestand INT NOT NULL DEFAULT 0
);

Bestellungen

CREATE TABLE bestellungen (
    id INT AUTO_INCREMENT PRIMARY KEY,
    kunde_id INT NOT NULL,
    bestelldatum DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (kunde_id) REFERENCES kunden(id)
        ON DELETE CASCADE
);

Bestellpositionen (Zwischentabelle für n:m)

CREATE TABLE bestellpositionen (
    bestellung_id INT NOT NULL,
    produkt_id INT NOT NULL,
    menge INT NOT NULL DEFAULT 1,
    PRIMARY KEY (bestellung_id, produkt_id),
    FOREIGN KEY (bestellung_id) REFERENCES bestellungen(id)
        ON DELETE CASCADE,
    FOREIGN KEY (produkt_id) REFERENCES produkte(id)
        ON DELETE CASCADE
);

🔹 Beispiel-Daten einfügen

Kunden

INSERT INTO kunden (vorname, nachname, email) VALUES
('Anna', 'Becker', 'anna@example.org'),
('Tom', 'Schmidt', 'tom@example.org');

Produkte

INSERT INTO produkte (name, preis, lagerbestand) VALUES
('Laptop', 999.00, 10),
('Maus', 25.50, 50),
('Monitor', 199.90, 20);

Bestellung + Positionen

INSERT INTO bestellungen (kunde_id) VALUES (1);

INSERT INTO bestellpositionen (bestellung_id, produkt_id, menge) VALUES
(1, 1, 1),  -- 1x Laptop
(1, 2, 2);  -- 2x Maus

🔹 Praktische Abfragen

Bestellungen mit Kundendaten

SELECT k.vorname, k.nachname, b.id AS bestell_id, b.bestelldatum
FROM kunden k
JOIN bestellungen b ON k.id = b.kunde_id;

Produkte in einer Bestellung

SELECT p.name, p.preis, bp.menge
FROM bestellpositionen bp
JOIN produkte p ON bp.produkt_id = p.id
WHERE bp.bestellung_id = 1;

Gesamtausgaben pro Kunde

SELECT k.vorname, k.nachname, SUM(p.preis * bp.menge) AS gesamt
FROM kunden k
JOIN bestellungen b ON k.id = b.kunde_id
JOIN bestellpositionen bp ON b.id = bp.bestellung_id
JOIN produkte p ON bp.produkt_id = p.id
GROUP BY k.id;

🔹 View anlegen

Eine View für alle Bestellungen mit Kunde + Summe:

CREATE VIEW bestelluebersicht AS
SELECT k.vorname, k.nachname, b.id AS bestell_id,
       SUM(p.preis * bp.menge) AS gesamt
FROM kunden k
JOIN bestellungen b ON k.id = b.kunde_id
JOIN bestellpositionen bp ON b.id = bp.bestellung_id
JOIN produkte p ON bp.produkt_id = p.id
GROUP BY b.id;

Nutzung:

SELECT * FROM bestelluebersicht;

🔹 Transaktion – Bestellung einfügen & Lagerbestand reduzieren

START TRANSACTION;

INSERT INTO bestellungen (kunde_id) VALUES (2);
SET @bestellung_id = LAST_INSERT_ID();

INSERT INTO bestellpositionen (bestellung_id, produkt_id, menge)
VALUES (@bestellung_id, 3, 1);

UPDATE produkte SET lagerbestand = lagerbestand - 1 WHERE id = 3;

COMMIT;

👉 Hinweis: Entweder wird alles ausgeführt oder bei einem Fehler mit ROLLBACK zurückgesetzt.

🔹 Übung

  1. Lege einen neuen Kunden und eine Bestellung mit mehreren Produkten an.
  2. Erstelle eine Abfrage, die dir den Lagerbestand aller Produkte nach der Bestellung anzeigt.
  3. Baue eine View, die dir pro Kunde den aktuellen Gesamtwert aller Bestellungen anzeigt.

✅ Zusammenfassung

  • Mit kunden, produkte, bestellungen und bestellpositionen hast du ein komplettes Shop-Datenmodell.
  • Du kannst CRUD-Befehle, JOINs, GROUP BY und Aggregatfunktionen kombinieren.
  • Mit Views vereinfachst du wiederkehrende Abfragen.
  • Mit Transaktionen sicherst du die Datenintegrität.

Damit hast du den Kurs von den Grundlagen bis zur produktiv nutzbaren Datenbank abgeschlossen 🎉.

📚 Inhaltsverzeichnis

👉 MariaDB Kapitel 1: Einführung & Installation im Terminal
👉 MariaDB Kapitel 2: Benutzer & Rechteverwaltung
👉 MariaDB Kapitel 3: Tabellen sauber anlegen (Primär- & Fremdschlüssel)
👉 MariaDB Kapitel 4: Grundbefehle & Kurzschreibweisen in der MariaDB-Konsole
👉 MariaDB Kapitel 5: CRUD-Befehle  – Daten einfügen, lesen, ändern und löschen
👉 MariaDB Kapitel 6: Primär- und Fremdschlüssel – Tabellen verknüpfen
👉 MariaDB Kapitel 7: Profi-Abfragen mit JOIN, GROUP BY & Aggregatfunktionen
👉 MariaDB Kapitel 8: Indexe, Views & Transaktionen
👉 MariaDB Kapitel 9: Produktivbetrieb – Sicherheit, Backups & Verwaltung
👉 MariaDB Kapitel 10: Abschlussprojekt – Ein Mini-Shop

📚 Bonus-Kapitel Ideen

👉 MariaDB Kapitel 11: Stored Procedures – Automatisierte Abläufe
👉 MariaDB Kapitel 12: Trigger – Aktionen bei Änderungen
👉 MariaDB Kapitel 13: Events – Zeitgesteuerte Aufgaben
👉 MariaDB Kapitel 14: Sicherheit & Best Practices
👉 MariaDB Kapitel 15: Performance-Tuning & Optimierung