SQL_LEVEL_DESIGNER_GUIDE - OnlyCook/abitur-elite-code GitHub Wiki

SQL Level Designer Dokumentation

Willkommen im SQL Level Designer von Abitur Elite Code. Dieses Werkzeug ermöglicht es dir, eigene Datenbank-Aufgaben im Stil der hessischen Abiturprüfung (Praktische Informatik) zu erstellen, zu testen und mit anderen zu teilen.

Inhaltsverzeichnis

  1. Dateisystem & Speicherort
  2. Die Benutzeroberfläche
  3. Die SQL Editoren
  4. Leitfaden für Abitur-konforme SQL-Levels
  5. Schritt-für-Schritt: Dein erstes SQL-Level

Dateisystem & Speicherort

Wie auch im C#-Designer gibt es zwei Dateitypen, achte hierbei auf das "s" (für SQL) in der Dateiendung:

  • .eliteslvldraft: Dies sind SQL-Entwürfe. Sie können jederzeit im Designer bearbeitet werden, sind aber nicht spielbar.
  • .eliteslvl: Dies sind exportierte SQL-Levels. Sie sind schreibgeschützt und können von Nutzern gespielt werden. Ein Export ist nur möglich, wenn der Entwurf den internen Selbsttest besteht.

Speicherort: Alle Levels befinden sich im Ordner levels im Verzeichnis der Anwendung.


Die Benutzeroberfläche

Metadaten

  • Level Name & Autor: Titel des Levels und dein Name.
  • Voraussetzungen: Du kannst auf die internen SQL-Themen (z.B. SELECT, INNER JOIN, GROUP BY) verlinken, um dem Spieler passende YouTube-Videos oder MySQL-Docs bereitzustellen.

Das Textfeld "Aufgabe" & "Materialien"

Hier beschreibst du die Aufgabenstellung. Die Formatierung funktioniert exakt wie im C#-Designer:

  • Fetter Text: **Wichtig**
  • Highlight (Blau): [Tabellenname] oder [Spaltenname]
  • Code-Block: {| SELECT * FROM Tabelle |}

Auch das Hinweis-System (start-hint: / start-tipp:) steht in den Materialien vollumfänglich zur Verfügung.

Das Relationale Modell (Schema)

Im SQL-Designer gibt es einen visuellen Editor für das relationale Modell.

  • Du kannst Tabellen erstellen, Spalten hinzufügen und diese als PK (Primärschlüssel, wird unterstrichen) oder FK (Fremdschlüssel, erhält eine Raute #) markieren.
  • WICHTIG (Das Schloss-Icon): Oben rechts im Editor findest du ein Schloss-Icon.
    • Gesperrt (Read-Only): Der Spieler sieht das fertige Modell und kann es nicht ändern.
    • Entsperrt (Bearbeitbar): Der Spieler erhält das Modell leer und muss das ER-Diagramm selbstständig in die 3. Normalform überführen.

ER-Diagramme (PlantUML)

Abitur Elite Code nutzt für SQL ausschließlich Entity-Relationship-Diagramme in der Chen-Notation. PlantUML unterstützt dies über die @startchen Syntax. Es gibt im SQL-Designer nur ein Hauptdiagramm.


Die SQL Editoren

Anders als bei C# wird hier kein Roslyn-C#-Code zur Validierung geschrieben. Die Engine führt stattdessen die SQL-Queries auf einer In-Memory SQLite Datenbank aus (wobei MySQL-Syntax emuliert wird).

1. Setup Script

Hier schreibst du reines SQL (CREATE TABLE und INSERT INTO), um die Start-Datenbank für das Level aufzubauen. Dieses Script wird vor jeder Abfrage des Spielers frisch ausgeführt.

2. Validierungs-Modus

Du musst dich entscheiden, welche Art von Aufgabe du stellst:

  • SELECT Abfrage (Standard): Der Spieler soll Daten auslesen. Seine Abfrage wird direkt mit der Musterlösung verglichen.
  • DML (UPDATE / INSERT / DELETE): Der Spieler soll Daten verändern. Da eine DML-Query keine Datentabelle zurückgibt, benötigt die Engine eine Verifizierungs-Abfrage.

3. Musterlösung

Hier trägst du die korrekte, finale SQL-Query ein (z.B. SELECT * FROM Buch WHERE preis < 10;). Wenn du auf "Ausführen" klickst, generiert die Engine aus dieser Musterlösung die Tabelle für das "Erwartete Ergebnis".

4. Verifizierungs-Abfrage (Nur bei DML)

Wenn du den Modus "DML" gewählt hast, reicht die Musterlösung (z.B. DELETE FROM Buch WHERE id = 1;) nicht aus, um das Ergebnis zu validieren. Du musst hier eine Abfrage eintragen (z.B. SELECT * FROM Buch;), die nach dem Ausführen der Spieler-Query aufgerufen wird, um den Zustand der Datenbank zu überprüfen.

5. Erwartetes Ergebnis (Expected Table)

Sobald du den internen Test ausführst, taucht unten eine Tabelle auf. Das ist das Ergebnis deiner Musterlösung.

  • Die Engine vergleicht die Query des Spielers zeilengenau und spaltengenau mit dieser Tabelle.
  • Spaltennamen-Striktheit: Standardmäßig sind Spaltennamen flexibel (Spieler kann SELECT name statt SELECT name AS gastname nutzen, solange die Daten stimmen). Wenn du explizit Aliase prüfen willst, setze den Spaltennamen im Editor in einfache Anführungszeichen (z.B. 'Gesamtwert'). Das erzwingt eine strikte Prüfung des Spaltennamens.

Leitfaden für Abitur-konforme SQL-Levels

Damit sich die Levels anfühlen wie echte Abiturprüfungen, müssen folgende Regeln und Konventionen strikt eingehalten werden:

  1. MySQL Emulation: Die App nutzt SQLite, emuliert aber MySQL-spezifische Funktionen (CONCAT, DATE_ADD, YEAR, MONTH, DATEDIFF). Nutze diese wie in MySQL gewohnt.
  2. Namenskonventionen:
    • Entitäten (Tabellen): PascalCase (z.B. Supermarkt, Buch).
    • Attribute (Spalten): camelCase (z.B. anzahlGetraenke).
    • IDs / Primärschlüssel: Alles kleingeschrieben ohne Unterstrich (z.B. kid, klasseid, artid). Vermeide generische Namen wie id.
    • Fremdschlüssel: Tragen exakt denselben Namen wie der referenzierte Primärschlüssel.
  3. Kardinalitäten (Flipped Chen): Das Abitur nutzt eine gedrehte Min-Max-Notation. Die Kardinalität steht neben der Entität, auf die sie sich bezieht.
    • Normal: A -(1,1)-b-(0,n)- C
    • Abitur Elite Code: A -(0,n)-b-(1,1)- C

Schritt-für-Schritt: Dein erstes SQL-Level

In diesem Leitfaden erstellen wir ein einfaches Level, in dem der Spieler Bücher aus einer Bibliothek nach ihrem Preis filtern muss.

Schritt 1: Metadaten festlegen

Fülle zuerst die grundlegenden Informationen im rechten Panel aus:

  • Name: Die Buch-Suche
  • Autor: Dein Name oder Pseudonym.

Schritt 2: Aufgabe & Materialien formulieren

Schreibe im Feld Aufgabe genau, was verlangt wird.

  • Beispiel: Ermittle den [titel] und den [preis] aller Bücher, die weniger als 9.00 Euro kosten.
  • Verwende im Feld Materialien Formatierung für Tipps. Nutze den speziellen Hint-Block für Hilfestellungen:
start-hint: Filterung
Mit der WHERE-Klausel kannst du Ergebnisse einschränken.
Beispiel: WHERE spalte < 10
:end-hint

Schritt 3: Das Setup-Script (Die Datenbank-Basis)

Wechsle zum Editor Setup Script (über den Pfeil-Button im Designer-Tab). Hier definierst du die Tabellen und Daten, die für das Level existieren sollen. Dieser Code ist für den Spieler unsichtbar.

CREATE TABLE Buch (
    bid INTEGER PRIMARY KEY,
    titel VARCHAR(255),
    autor VARCHAR(255),
    preis DOUBLE
);
 
INSERT INTO Buch VALUES (1, 'Faust', 'Goethe', 9.99);
INSERT INTO Buch VALUES (2, 'Die Verwandlung', 'Kafka', 5.50);
INSERT INTO Buch VALUES (3, 'Der Prozess', 'Kafka', 8.90);

Schritt 4: Das Relationale Modell (Die Sicht des Spielers)

Damit der Spieler unkompliziert weiß, welche Tabellen er abfragen kann oder du kein ER-Diagramm geben willst, kannst du das Schema im Tab "Aufgabe" unter Relationales Modell definieren:

  1. Klicke auf das Schloss-Symbol, um das relationale Modell für Spieler zu sperren und deshalb für dich editierbar zu machen.
  2. Klicke auf + Tabelle und nenne sie Buch.
  3. Füge die Spalten bid (als PK markieren), titel, autor und preis hinzu.
  4. Optional: Erstelle im Feld PlantUML ein ER-Diagramm in Chen-Notation, das dem Spieler visuell hilft.
@startchen
entity Buch {
    bid <<key>>
    titel
    autor
    preis
}
@endchen

Schritt 5: Validierungs-Modus & Musterlösung

Wähle SELECT Abfrage (Standard) als Validierungs-Modus.

Trage nun im Editor Musterlösung den korrekten SQL-Code ein:

SELECT titel, preis FROM Buch WHERE preis < 9.00;

Schritt 6: Die Erwartete Tabelle

Überführe folgende ASCII-Tabelle (die App nutzt Einfüge-Buffer "LEER " am Ende, diese zählen nicht zur Tabelle):

┌─────────────────┬────────┐
│      titel      │ preis  │
│   VARCHAR(255)  │ DOUBLE │
├─────────────────┼────────┤
│ Die Verwandlung │ 5.5    │
│ Der Prozess     │ 8.9    │
└─────────────────┴────────┘

Schritt 7: Testen & Exportieren

  1. Gehe sicher, dass du das Textfeld "Musterlösung" editierst (klicke dafür auf den Pfeil rechts neben dem Titel "Musterlösung").
  2. Klicke oben rechts auf den großen grünen Button ▶ AUSFÜHREN.
  3. Im Output-Fenster sollte nun grün erscheinen: ✓ DESIGNER TEST BESTANDEN!.
  4. Darunter siehst du die generierte "Erwartete Tabelle" (Expected Table) mit "Die Verwandlung" und "Der Prozess".
  5. Der Button Exportieren ist nun aktiv. Klicke darauf, um die .eliteslvl Datei zu generieren!

Beispiel-Dateien herunterladen

Falls du die fertigen Beispiel-Dateien direkt verwenden möchtest:

Lege die heruntergeladenen Dateien einfach in deinen levels-Ordner (neben der .exe, wenn keiner existiert erstelle diesen selbst).

⚠️ **GitHub.com Fallback** ⚠️