Übungsaufgaben zu NoSQL, Dokumentendatenbanken und JSON

https://bildung.social/@oerinformatik/

https://oer-informatik.de/nosql-json-uebungsaufgaben

NoSQL, Dokumentendatenbank, JSON, MongoDB, Schemavalidierung, CAP-Theorem, BASE, Zeitreihendatenbank, Big Data, Übungsaufgaben, Prüfungsvorbereitung

tl/dr; (Bearbeitungszeit insgesamt 130 min, mehrere Aufgaben): Vier Übungsaufgaben zu NoSQL-Datenbanken und JSON. Zwei kürzere Aufgaben zum Einstieg behandeln die Vorteile eines Datenbanksystems gegenüber einer Tabellenkalkulation, Arten nicht-relationaler Datenbanken, Zeitreihendatenbanken für Sensorwerte und Big Data am Beispiel von Positionsdaten. Die beiden umfangreichen Aufgaben danach üben: Fachbegriffe zuordnen, Tabellen in JSON umwandeln und Daten einbetten, JSON-Dokumente analysieren und korrigieren, einen englischen Fachtext auswerten, Risiken eines flexiblen Schemas benennen, relationale und dokumentenorientierte Datenbanken vergleichen und begründet auswählen, BASE und CAP anwenden sowie die Austauschformate JSON, XML und CSV beurteilen. Alle Beispiellösungen sind ausgeblendet und mit Punkteverteilung versehen [AI-Assisted]. (Zuletzt geändert am 27.10.2026)

Diese Übungsaufgaben gehören zum Artikel NoSQL und Dokumentendatenbanken: Daten als JSON speichern. Grundlagen zu Tabellen, Schlüsseln und Beziehungen findest Du im Artikel Das Relationenmodell, zu Transaktionen und ACID im Artikel Datenbankkonzepte.

Hinweise zur Bearbeitung: Als FIA, FISY, FIDV, ISE oder IKD musst Du zur Teil-2-Prüfung Aufgaben auf Kernkompetenz-Ebene lösen können, das sind Aufgabe 2.1 und Aufgabe 2.2. Von FIA und IKD wird zusätzlich erwartet, dass ihnen Aufgaben auf Profilkompetenz-Ebene (Aufgabe 3.1 und Aufgabe 3.2) keine Probleme bereiten. Achte auf die Operatoren: „Nennen“ verlangt Stichworte, „beschreiben“ und „erläutern“ verlangen ganze Sätze mit Begründung oder Beispiel, „begründen“ verlangt eine klare Entscheidung mit passenden Argumenten. Schreib JSON so, dass ein Parser es fehlerfrei einlesen könnte. Schreib Deine Lösung zuerst vollständig auf, bevor Du die Beispiellösung aufklappst.

Aufgabe 2.1: Raumklima-Messwerte für das Berufskolleg (Kernkompetenz)

(ca. 23 min Bearbeitungszeit)

Die Schul-IT OWL betreut das Netz des Ratz und Rübe Berufskollegs (RRB) in Bielefeld. Nach dem Barcamp werden in allen Klassenräumen 120 Raumsensoren installiert, die CO₂-Gehalt, Temperatur und Luftfeuchte messen und über MQTT an einen zentralen Server schicken. Bisher führt Netzwerkadministratorin Svenja Krämer die Liste der Sensoren (Raum, Gerätename, Einbaudatum, Batteriewechsel, Störungen) in einer Tabellenkalkulation, die drei Kolleg*innen abwechselnd bearbeiten. Die Messwerte selbst sollen künftig dauerhaft gespeichert und ausgewertet werden.

a) Svenja möchte die Sensorliste in eine Datenbank überführen. Beschreibe zwei Vorteile eines Datenbankmanagementsystems gegenüber der bisherigen Tabellenkalkulation. (4 Punkte)

Je Vorteil 1 Punkt für die Nennung, 1 Punkt für die Beschreibung mit Bezug zur Situation, z. B.:

  • Mehrbenutzerzugriff: Die drei Kolleg*innen können gleichzeitig Störungen und Batteriewechsel eintragen, ohne sich gegenseitig Änderungen zu überschreiben; es gibt keine konkurrierenden Kopien der Datei mehr.

  • Zugriffsschutz: Über Benutzerkonten und Rechte lässt sich festlegen, wer Sensoren anlegen darf und wer nur lesen darf, z. B. die Hausmeisterei.

  • Datenintegrität: Datentypen, Pflichtfelder und eindeutige Schlüssel verhindern doppelte Gerätenamen, Tippfehler in Datumsangaben oder Sensoren ohne Raum.

  • Leistung und Auswertung: Auch bei vielen Einträgen bleiben Abfragen schnell, und Auswertungen („alle Sensoren mit Batteriewechsel vor über einem Jahr“) sind per SQL möglich.

b) Ein Kollege meint, für die Messwerte komme „sowieso nur MariaDB oder NoSQL“ in Frage. Nenne zwei Arten nicht-relationaler Datenbanken. (2 Punkte)

Je richtiger Art 1 Punkt, z. B.: Schlüssel-Wert-Datenbank, Dokumentendatenbank, Spaltenfamilien-Datenbank, Graphdatenbank, Zeitreihendatenbank, Objektdatenbank, Vektordatenbank.

c) Ordne den Anwendungsfällen der Schul-IT die jeweils am besten passende Datenbankart zu, indem Du die Ziffer einträgst. Jede Ziffer wird genau einmal verwendet. (5 Punkte)

  1. relationale Datenbank, 2) Schlüssel-Wert-Datenbank, 3) Dokumentendatenbank, 4) Graphdatenbank, 5) Zeitreihendatenbank
Anwendungsfall Ziffer
CO₂-, Temperatur- und Feuchtewerte aller Sensoren im Minutentakt
Sitzungsdaten der angemeldeten Lehrkräfte im Raumbuchungsportal, die nach 30 Minuten verfallen
Verkabelung im Gebäude: welcher Access Point hängt an welchem Switchport, welcher Switch an welchem Verteiler? Gesucht wird z. B. „Was fällt aus, wenn Switch B-2 ausfällt?“
Ausleihe von Notebooks: Geräte, Lehrkräfte, Ausleihen mit Rückgabedatum, Abrechnung mit dem Schulträger
Störungsberichte der Sensoren mit je nach Gerätetyp ganz unterschiedlichen Diagnosefeldern

Je richtiger Zuordnung 1 Punkt:

Anwendungsfall Ziffer
Messwerte im Minutentakt 5 (Zeitreihendatenbank)
Sitzungsdaten mit Ablaufzeit 2 (Schlüssel-Wert-Datenbank, z. B. Redis mit Ablaufzeit je Schlüssel)
Verkabelung und Abhängigkeiten 4 (Graphdatenbank: Knoten und Kanten, Pfade verfolgen)
Notebook-Ausleihe mit Abrechnung 1 (relationale Datenbank: stark verknüpfte, strukturierte Daten, Transaktionen)
Störungsberichte mit wechselnden Feldern 3 (Dokumentendatenbank: flexibles Schema)

d) Erläutere den wesentlichen Unterschied zwischen SQL-Datenbanken und NoSQL-Datenbanken. (4 Punkte)

Je Seite 2 Punkte, z. B.:

  • SQL-Datenbanken sind relationale Datenbanken: Die Daten liegen in Tabellen mit festem, vorab definiertem Schema, die über Schlüssel logisch verknüpft sind; abgefragt wird einheitlich mit der standardisierten Sprache SQL. Sie eignen sich besonders für strukturierte, stark verknüpfte Daten und Transaktionen.

  • NoSQL-Datenbanken sind nicht relational: Sie speichern Daten in anderen Formaten, z. B. als Dokumente, Schlüssel-Wert-Paare, Graphen oder Zeitreihen, meist mit flexiblem Schema; statt einer einheitlichen Abfragesprache gibt es herstellerspezifische APIs. Sie eignen sich für wechselnde oder unstrukturierte Daten und sehr große, verteilte Datenmengen.

e) Die Sensoren senden einmal pro Minute je einen Datensatz mit drei Messwerten.

ea) Berechne, wie viele Datensätze alle 120 Sensoren an einem Tag und in einem Jahr (365 Tage) erzeugen. (2 Punkte)

Geg.: 120 Sensoren, 1 Datensatz je Minute, 1.440 Minuten je Tag, 365 Tage

Ges.: Datensätze je Tag n_T und je Jahr n_J

n_T = 120 \cdot 1.440 = \underline{\underline{172.800\ \text{Datensätze}}}

(1 Punkt)

n_J = 172.800 \cdot 365 = \underline{\underline{63.072.000\ \text{Datensätze}}}

(1 Punkt)

eb) Die Messwerte sollen in einer Zeitreihendatenbank gespeichert werden. Beschreibe zwei Vorteile, die sich durch eine Zeitreihendatenbank gegenüber anderen Datenmodellen ergeben. (4 Punkte)

Je Vorteil mit Beschreibung 2 Punkte, z. B.:

  • Sie ist für Daten aus Zeitstempel, Messwert und wenigen Metainformationen (Sensor, Raum) optimiert und schreibt die rund 172.800 Datensätze am Tag sehr schnell weg.

  • Zeitbezogene Abfragen sind eingebaut, z. B. der Mittelwert des CO₂-Gehalts je Raum in der letzten Stunde oder der Höchstwert je Schultag.

  • Alte Daten werden automatisch gelöscht oder verdichtet, z. B. Rohwerte nach 30 Tagen nur noch als Stundenmittel; das begrenzt den Speicherbedarf.

  • Die Daten werden stark komprimiert und lassen sich einfach skalieren, wenn weitere Schulen hinzukommen.

ec) Begründe, warum eine relationale Datenbank für die fortlaufenden Messwerte wenig geeignet ist, für die Sensorliste aus a) aber gut. (4 Punkte)

Messwerte (2 Punkte): Die Messwerte haben keine Beziehungen untereinander, sondern folgen nur zeitlich aufeinander. Eine relationale Datenbank könnte sie speichern, aber ihre Stärken (Fremdschlüssel, JOINs, Normalisierung, Transaktionen) würden kaum genutzt und brächten unnötige Komplexität und Ressourcenverbrauch; bei über 63 Millionen Datensätzen im Jahr wachsen Tabelle und Indizes stark, und das Löschen alter Werte ist aufwendig.

Sensorliste (2 Punkte): Die Sensorliste ist klein, klar strukturiert und mit Räumen, Störungen und Batteriewechseln verknüpft; hier zahlen sich festes Schema, referentielle Integrität, Mehrbenutzerzugriff und SQL-Auswertungen aus. Die Schul-IT kombiniert also sinnvoll beide Datenbankarten.

Aufgabe 2.2: Positionsdaten von „CSB-Rad Connect Privat“ (Kernkompetenz)

(ca. 20 min Bearbeitungszeit)

Die CSB-Rad GmbH in Bielefeld bietet ab Frühjahr 2027 den Ortungsdienst „CSB-Rad Connect Privat“ an: Ein Tracker im Rahmen meldet während der Fahrt alle 30 Sekunden Position, Geschwindigkeit und Akkustand über das Mobilfunknetz; Kund*innen sehen in der App ihre zurückgelegten Routen und finden ihr Rad bei einem Diebstahl wieder. Geschäftsführer Cem Sarıkaya rechnet bis Ende 2028 mit 8.000 Trackern. Abos, Kundendaten und Rechnungen liegen in der MariaDB-Datenbank des Shops.

a) In einer Besprechung fällt mehrfach das Schlagwort „Big Data“. Erläutere den Begriff Big Data. (3 Punkte)

Big Data bezeichnet Datenmengen, die klassische Datenbanken und Auswertungsverfahren kaum noch bewältigen; beschrieben werden sie mit den drei V (je V 1 Punkt):

  • Volume: sehr große Datenmengen (Tera- bis Petabyte), z. B. Positionsmeldungen Tausender Tracker über Jahre.

  • Velocity: Die Daten entstehen sehr schnell und sollen oft in Echtzeit verarbeitet werden, z. B. viele Meldungen pro Sekunde.

  • Variety: strukturierte, halbstrukturierte und unstrukturierte Daten gemischt, z. B. Positionen, Fotos eines gestohlenen Rads, Diebstahlanzeigen als Text.

b) Eine Positionsmeldung ist als JSON-Dokument etwa 180 Byte groß. Im Schnitt ist jedes Rad 45 Minuten am Tag unterwegs. Zu Spitzenzeiten sind 3.000 Räder gleichzeitig in Bewegung.

Berechne die Datenmenge der Positionsmeldungen pro Tag und pro Jahr (365 Tage, 1 GB = 10⁹ Byte) bei 8.000 Trackern sowie die Zahl der Meldungen pro Sekunde zu Spitzenzeiten. (5 Punkte)

Geg.: 8.000 Tracker, 45 min Fahrt je Tag, 1 Meldung je 30 s, 180 Byte je Meldung, 3.000 Räder gleichzeitig

Ges.: Datenmenge je Tag D_T und je Jahr D_J, Meldungen je Sekunde r

Meldungen je Rad und Tag (1 Punkt):

m = \frac{45 \cdot 60\,\text{s}}{30\,\text{s}} = 90

Datenmenge je Tag (1 Punkt):

D_T = 8.000 \cdot 90 \cdot 180\,\text{Byte} = 129.600.000\,\text{Byte} \approx \underline{\underline{0{,}130\,\text{GB}}}

Datenmenge je Jahr (1 Punkt):

D_J = 129.600.000\,\text{Byte} \cdot 365 = 47.304.000.000\,\text{Byte} = \underline{\underline{47{,}304\,\text{GB}}}

Meldungen je Sekunde zu Spitzenzeiten (2 Punkte):

r = \frac{3.000}{30\,\text{s}} = \underline{\underline{100\ \text{Meldungen je Sekunde}}}

c) Beurteile mithilfe Deiner Ergebnisse, ob es sich bei den Positionsdaten um Big Data handelt. (3 Punkte)

Beurteilung mit Bezug auf mindestens zwei V (3 Punkte), z. B.: Die Datenmenge ist mit rund 47 GB im Jahr für heutige Server gut beherrschbar, sie allein macht noch kein Big Data. Kritischer ist die Geschwindigkeit: 100 Meldungen pro Sekunde (bei Wachstum deutlich mehr) müssen laufend gespeichert und für die Live-Ortung in Echtzeit ausgewertet werden. Kommen später Fotos, Diebstahlanzeigen oder Daten anderer Tracker-Modelle hinzu, wächst auch die Vielfalt. Die Positionsdaten zeigen also Merkmale von Big Data (vor allem Velocity), ohne beim Volumen schon an Grenzen zu stoßen. Eine andere, schlüssig begründete Beurteilung ist ebenfalls richtig.

d) Ein Mitarbeiter schlägt vor, die Positionsmeldungen einfach als weitere Tabelle in der Shop-Datenbank zu speichern, die nach einem ER-Modell entworfen wurde. Triff eine begründete Aussage, ob das klassische ER-Modell und das relationale Datenmodell für die Positionsdaten geeignet sind. (3 Punkte)

Aussage mit Begründung (3 Punkte), z. B.: Für die Positionsdaten sind ER-Modell und relationale Shop-Datenbank wenig geeignet. Die Meldungen sind fortlaufende Messwerte ohne Beziehungen untereinander; sie entstehen schnell und in großer Zahl und würden die Shop-Datenbank mit Schreibzugriffen belasten, die für Bestellungen gebraucht wird. Ein festes Schema passt zudem schlecht, wenn neue Tracker-Modelle zusätzliche Felder senden. Besser ist eine Zeitreihen- oder Dokumentendatenbank für die Positionen; Abos, Kundendaten und Rechnungen bleiben relational in MariaDB, verknüpft über die Tracker-ID.

e) Jonas, Dein Mit-Azubi, hat die erste Testmeldung eines Trackers so aufgeschrieben:

{
  "tracker_id": "CSB-TRK-000417",
  "zeit": "2027-03-15T07:42:30+01:00",
  "position": { "lat": "52.0302", "lon": 8.5325 },
  "geschwindigkeit_kmh": 18,4,
  'akku_prozent': 87,
  "in_bewegung": TRUE,
}

Finde die fünf Fehler bzw. ungünstigen Datentypen und schreibe das Dokument korrekt auf. (5 Punkte)

Je gefundenem und korrigiertem Fehler 1 Punkt:

  • "lat": "52.0302" ist ein String; die Breite muss wie lon eine Zahl sein, sonst lässt sich nicht rechnen.

  • 18,4 – Dezimalzahlen werden in JSON mit Punkt geschrieben (18.4); das Komma trennt Werte.

  • 'akku_prozent' – Schlüssel und Strings stehen in doppelten Anführungszeichen.

  • TRUE – Wahrheitswerte werden klein geschrieben (true).

  • Das Komma nach dem letzten Wertpaar ist nicht erlaubt.

f) Cem bittet Dich um eine Empfehlung, in welchen Datenbanken die drei Datenarten des Dienstes gespeichert werden sollen: (1) Abos und Rechnungen, (2) Positionsmeldungen, (3) Profile der Tracker-Modelle mit je nach Hersteller unterschiedlichen Konfigurationsfeldern. Schlage für jede Datenart eine Datenbankart vor und begründe kurz. (3 Punkte)

Je Datenart mit Begründung 1 Punkt, z. B.:

  1. Abos und Rechnungen → relationale Datenbank (MariaDB): strukturierte, verknüpfte Daten, bei denen es um Geld geht; Transaktionen und referentielle Integrität sind wichtig, und die Daten liegen schon dort.

  2. Positionsmeldungen → Zeitreihendatenbank (alternativ Dokumentendatenbank): viele fortlaufende Messwerte mit Zeitstempel, schnelles Schreiben, Zeitfunktionen für Routen, automatisches Löschen alter Positionen (auch aus Datenschutzgründen).

  3. Tracker-Profile → Dokumentendatenbank: Jedes Modell hat andere Konfigurationsfelder; ein flexibles Schema nimmt neue Modelle ohne Schemaänderung auf.

Aufgabe 3.1: Ein Produktkatalog mit wechselnden Merkmalen im Fahrrad-Onlineshop (Profilkompetenz)

(ca. 42 min Bearbeitungszeit)

Du bist Auszubildende*r im Entwicklungsteam der CSB-Rad GmbH in Bielefeld. Das Unternehmen verkauft Fahrräder und Komponenten über einen Onlineshop; Bestellungen, Rechnungen und Lagerbestände liegen in einer MariaDB-Datenbank.

Sophie Bertram, Geschäftsführerin Vertrieb und E-Commerce, möchte die Produktseiten ausbauen: Jede Produktart soll ihre eigenen technischen Merkmale zeigen (beim E-Bike die Akkukapazität, beim Schloss die Sicherheitsstufe), und die Kundschaft soll danach filtern können. Bisher stehen diese Merkmale in einer eigenen Tabelle. Cem Sarıkaya, Geschäftsführer Technik und IT, plant deshalb einen Katalogdienst mit einer dokumentenorientierten Datenbank. Du sollst ihn zusammen mit Deinem Mit-Azubi Jonas vorbereiten.

Auszug aus der bisherigen Datenbank csbrad:

Tabelle artikel (Auszug; netto_preis DECIMAL(10,2), konfigurierbar BOOLEAN)
artikel_id artikelnr bezeichnung netto_preis konfigurierbar
2 RAD-EB-02 E-Bike „Kanal“ Mittelmotor 500 Wh 2520.17 FALSE
5 SCH-BUE-01 Bügelschloss, gleichschließend 62.18 TRUE
Tabelle artikel_merkmal (Auszug; wert VARCHAR(50), einheit VARCHAR(10) NULL; Fremdschlüssel artikel_id → artikel)
merkmal_id artikel_id merkmal wert einheit
1 2 Akkukapazität 500 Wh
2 2 Motor Mittelmotor NULL
3 2 Gänge 8 NULL
4 5 Sicherheitsstufe 12 NULL
5 5 Bügellänge 230 mm

a) Beschreibe zwei Nachteile, die das Speichern der Merkmale in der Tabelle artikel_merkmal für die geplanten Produktseiten und Filter hat. (4 Punkte)

Je Nachteil 2 Punkte (Nachteil 1 Punkt, Beschreibung mit Bezug zur Tabelle 1 Punkt), z. B.:

  • Alle Werte sind Text (wert ist VARCHAR): Die Datenbank kann nicht prüfen, ob eine Akkukapazität wirklich eine Zahl ist; ein Filter „Akkukapazität ab 400 Wh“ vergleicht Texte ('500' > '1000') oder muss jeden Wert erst umwandeln.

  • Für jede Produktseite ist ein JOIN nötig, und ein Artikel besteht aus vielen Zeilen in zwei Tabellen; das Programm muss die Zeilen wieder zu einem Objekt zusammensetzen. Ein Filter über zwei Merkmale (z. B. Akkukapazität und Motor) braucht sogar mehrere JOINs bzw. Unterabfragen.

  • Keine Pflichtmerkmale und keine einheitlichen Namen: Ob jedes E-Bike eine Akkukapazität hat und ob sie überall „Akkukapazität“ heißt, kann die Datenbank nicht sicherstellen.

  • Die Alternative, für jedes Merkmal eine eigene Spalte in artikel anzulegen, führt zu vielen leeren Feldern (NULL) und zu Schemaänderungen bei jedem neuen Produkttyp – beim Bügelschloss blieben z. B. Akkukapazität und Motor leer, beim E-Bike Sicherheitsstufe und Bügellänge.

b) Für die Einarbeitung erstellt Jonas eine Gegenüberstellung der Fachbegriffe. Ordne den Begriffen der relationalen Datenbank (1–5) den passenden Begriff der dokumentenorientierten Datenbank (A–E) zu. (5 Punkte)

Nr. relationale Datenbank (MariaDB) Buchstabe
1 Datenbank csbrad
2 Tabelle artikel
3 Datensatz (Zeile) mit artikel_id 5
4 Spalte bezeichnung
5 Primärschlüssel artikel_id
Buchstabe dokumentenorientierte Datenbank (z. B. MongoDB)
A Field
B Collection
C _id
D Database
E Document

Je richtiger Zuordnung 1 Punkt:

Nr. relationale Datenbank dokumentenorientierte Datenbank
1 Datenbank csbrad D Database
2 Tabelle artikel B Collection
3 Datensatz (Zeile) E Document
4 Spalte bezeichnung A Field
5 Primärschlüssel artikel_id C _id

c) Der Katalogdienst speichert JSON-Dokumente.

ca) Wandle die beiden Tabellenauszüge in die JavaScript Object Notation (JSON) um. Stelle jede Tabelle als Array dar. (8 Punkte)

Tabelle artikel (3 Punkte: Array und Objekte 1 Punkt, Schlüssel-Wert-Paare 1 Punkt, Datentypen 1 Punkt):

Tabelle artikel_merkmal (5 Punkte: je Objekt 1 Punkt):

Bewertungshinweise:

  • Da wert in der Tabelle ein Text ist, ist "500" die genaue Umwandlung; 500 als Zahl ist ebenfalls richtig.

  • NULL wird zu null (ohne Anführungszeichen). Ein weggelassenes Feld einheit ist vertretbar, "NULL" als Text ist falsch (0,5 Punkte Abzug).

  • Wahrheitswerte als true/false, Zahlen ohne Anführungszeichen und mit Dezimalpunkt. Statt false/true sind auch 0/1 vertretbar, weil MariaDB BOOLEAN als TINYINT(1) speichert.

  • Ein Kommentar wie // artikel über dem Array ist kein gültiges JSON (kein Punktabzug, wenn er nur als Beschriftung außerhalb des Arrays steht).

cb) Auf einen Artikel und seine Merkmale wird fast immer gemeinsam zugegriffen, und ein Artikel hat nur wenige Merkmale. Füge die Merkmale deshalb als Array merkmale in das jeweilige Artikeldokument ein. Verwende für die Werte passende JSON-Datentypen. (7 Punkte)

Bewertung (7 Punkte):

  • Array merkmale im richtigen Artikeldokument, korrekt geklammert: je Artikel 1 Punkt (2 Punkte),

  • fünf Merkmalsobjekte vollständig: je 0,5 Punkte (2,5 Punkte),

  • Fremdschlüssel artikel_id in den eingebetteten Merkmalen entfällt (1 Punkt); die merkmal_id darf bleiben, muss aber nicht,

  • Zahlenwerte als number, Text als string (1 Punkt), fehlende Einheit weggelassen oder null (0,5 Punkte).

Ebenfalls richtig ist ein eingebettetes Objekt statt eines Arrays, z. B. "merkmale": { "akkukapazitaetWh": 500, "motor": "Mittelmotor", "gaenge": 8 } – damit lassen sich die Merkmale sogar direkt filtern. Gefordert war aber ein Array; volle Punktzahl, wenn alle Merkmale korrekt enthalten sind.

cc) Bastian Ludwig schlägt vor, auch alle Kundenbewertungen eines Artikels (Sterne, Text, Datum, Kundennummer) in das Artikeldokument einzubetten. Nimm Stellung zu diesem Vorschlag. (3 Punkte)

Der Vorschlag ist nicht sinnvoll; die Bewertungen sollten in einer eigenen Collection liegen und auf den Artikel verweisen (Referenz über die Artikelnummer) (1 Punkt). Begründung (2 Punkte, je Argument 1 Punkt), z. B.:

  • Die Zahl der Bewertungen ist nicht begrenzt und wächst ständig; das Artikeldokument würde immer größer (in MongoDB höchstens 16 MB je Dokument), und jede Produktseite lädt alle Bewertungen mit, auch wenn nur die ersten fünf angezeigt werden.

  • Bewertungen werden unabhängig vom Artikel gelesen und geändert (z. B. „alle Bewertungen einer Kundin“, Löschung nach DSGVO, Freigabe durch die Moderation).

  • Bewertungen enthalten personenbezogene Daten (Kundennummer); sie getrennt zu halten, erleichtert Zugriffsrechte und Löschfristen.

Andere begründete Stellungnahmen sind möglich, z. B.: nur die Durchschnittsnote und die drei neuesten Bewertungen einbetten, den Rest referenzieren.

d) Der Katalogdienst liefert für das E-Bike inzwischen folgendes Dokument:

Das Shop-Backend ist in Java geschrieben. Vervollständige die Tabelle anhand des Dokuments. (7 Punkte)

Feld JSON-Datentyp Inhalt passender Java-Datentyp
bezeichnung string E-Bike „Kanal“ Mittelmotor 500 Wh String
lieferbar boolean
number 4
gewichtKg 24.5
akku eigene Klasse Akku
rahmenhoehenCm
nachfolger String (Referenz auf eine Artikelnummer)
geaendertAm

Je richtiger Zeile 1 Punkt (7 Punkte; ergänzte Angaben fett):

Feld JSON-Datentyp Inhalt passender Java-Datentyp
lieferbar boolean true boolean
lagerbestand number 4 int
gewichtKg number 24.5 double (auch BigDecimal)
akku object { "kapazitaetWh": 500, "spannungV": 36 } eigene Klasse Akku
rahmenhoehenCm array (aus numbers) 50, 55, 60 int[] bzw. List<Integer>
nachfolger null kein Wert (null) String (Referenz auf eine Artikelnummer)
geaendertAm string 2026-10-12T09:30:00+02:00 OffsetDateTime (auch LocalDateTime, ZonedDateTime, Instant; String nur mit Abzug)

Hinweis: JSON kennt nur den Typ number; ob im Programm int oder double passt, ergibt sich aus der Bedeutung (Stückzahl ganzzahlig, Gewicht mit Nachkommastellen). null ist ein eigener JSON-Datentyp; in Java bleibt die Variable vom Typ String, enthält aber null. JSON hat keinen Datumstyp: Datum und Uhrzeit stehen als String, üblicherweise im Format ISO 8601 (hier mit Zeitzonenabstand +02:00). Das Programm wandelt den String beim Einlesen in einen Datumstyp um.

e) Jonas hat für das Bügelschloss ein Katalogdokument von Hand geschrieben. Beim Import meldet der JSON-Parser einen Fehler.

{
  // Bügelschloss, passt zur Schließanlage der Kundin
  "_id": "SCH-BUE-01",
  bezeichnung: "Bügelschloss, gleichschließend",
  "preis": { "netto": 62,18, "mwstSatz": 19 },
  "lieferbar": True,
  'sicherheitsstufe': 12,
  "farben": ["Schwarz", "Gelbgrün",],
}

Kennzeichne alle Fehler und gib eine korrigierte, gültige Fassung an. (7 Punkte)

Je gefundenem und korrigiertem Fehler 1 Punkt (7 Fehler):

  1. Zeile 2: Kommentar // … ist in JSON nicht erlaubt (Information weglassen oder als Feld speichern, z. B. "hinweis": "…").

  2. Zeile 4: Schlüssel bezeichnung steht nicht in Anführungszeichen.

  3. Zeile 5: Dezimalkomma 62,18 – richtig 62.18 (so ist es außerdem ein zusätzliches, ungültiges Element ohne Schlüssel).

  4. Zeile 6: True muss klein geschrieben werden: true.

  5. Zeile 7: einfache Anführungszeichen um sicherheitsstufe – richtig "sicherheitsstufe".

  6. Zeile 8: Komma nach dem letzten Array-Element "Gelbgrün",].

  7. Zeile 8: Komma nach dem letzten Schlüssel-Wert-Paar vor der schließenden }.

Korrigierte Fassung:

f) Cem Sarıkaya überlegt: „Wenn wir schon eine Dokumentendatenbank einführen, speichern wir gleich auch Bestellungen, Zahlungen und Rechnungen dort.“ Schlage für diese Daten eine Datenbankart vor und begründe Deinen Vorschlag mit zwei Argumenten. (5 Punkte)

Entscheidung 1 Punkt, je Argument 2 Punkte. Erwartet wird in der Regel: Bestellungen, Zahlungen und Rechnungen bleiben in der relationalen Datenbank (MariaDB). Argumente, z. B.:

  • Transaktionssicherheit (ACID): Beim Bestellen müssen Bestellung, Bestellpositionen, Lagerbestand und ggf. Fertigungsauftrag gemeinsam oder gar nicht gespeichert werden; zwei Kund*innen dürfen das letzte E-Bike nicht gleichzeitig kaufen. Ein relationales DBMS garantiert das mit Transaktionen.

  • Konsistenz und referentielle Integrität: Jede Bestellung gehört zu einem vorhandenen Kundenkonto, jede Position zu einem Artikel, jede Rechnung zu einer Bestellung. Fremdschlüssel lassen das DBMS das prüfen; in der Dokumentendatenbank müsste das Programm es selbst sicherstellen.

  • Strukturierte Daten mit festen Pflichtangaben: Bestellungen und Rechnungen haben immer dieselben Felder (Pflichtangaben einer Rechnung); die Flexibilität eines Dokumentenschemas bringt hier keinen Vorteil.

  • Auswertungen mit SQL: Umsatzauswertungen, Mahnwesen und Abgleich mit der Buchhaltung laufen bereits mit SQL; Wissen und Abfragen sind vorhanden.

Ein Vorschlag für die Dokumentendatenbank ist nur mit passender Begründung richtig, z. B.: Eine Bestellung wird als Ganzes gelesen (Bestellung mit Positionen als ein Dokument), und moderne Dokumentendatenbanken unterstützen ebenfalls Transaktionen über mehrere Dokumente.

Aufgabe 3.2: Die Mitfahr-App wächst – welche Datenbank für welche Daten? (Profilkompetenz)

(ca. 45 min Bearbeitungszeit)

Die Mitfahr-App RatzFahrt des Ratz und Rübe Berufskollegs (RRB) in Bielefeld läuft seit dem Schuljahresbeginn erfolgreich: Auszubildende aus dem Umland bieten Fahrten zu den Berufsschultagen an oder suchen eine Mitfahrgelegenheit; Flurmonitore zeigen offene Angebote anonym an. Bisher liegen alle Daten in der MariaDB-Datenbank ratzfahrt.

Zwei weitere Berufskollegs aus Gütersloh und Herford möchten mitmachen. Thomas Becker, Projektleiter seitens der Schule, hat dafür eine Liste neuer Funktionen gesammelt: Fahrtangebote sollen frei wählbare Zusatzmerkmale bekommen (z. B. „Fahrradträger“, „Assistenzhund willkommen“), Fahrer*in und Mitfahrende sollen sich kurz per Chat abstimmen können, und die App soll Routen mit Zwischenhalten vorschlagen. Svenja Krämer von der Schul-IT OWL weist darauf hin, dass die Datenbank dann auf Servern in zwei Rechenzentren des Schulträgers laufen wird. Du gehörst zum FIA-Projektteam und sollst die Datenhaltung mitplanen.

a) Das Team liest die Dokumentation einer quelloffenen Dokumentendatenbank:

Why choose a document database?

In a relational database, the data of one business object is usually split across several tables. Every time the application needs the whole object, the tables have to be joined again. A document database stores everything that belongs together in one document, so a single read returns all the data – this makes typical queries fast, even when the data is deeply nested.

Documents in the same collection do not have to share the same structure. A new field can be added to new documents at any time, without a schema migration and without downtime. This allows teams to release new features quickly and to store data whose structure changes often.

Documents are written in a JSON-like format that maps directly to the objects in your program code. Developers work with data in the same way they think about it, and less mapping code is needed.

Finally, the database is designed to scale out: data can be distributed over many servers (sharding) and copied to several locations (replica sets), so that the system stays available even if one server fails. Note, however, that keeping copies on different servers consistent at all times has a price; your application has to decide how up to date its reads must be.

aa) Erläutere mithilfe des Textes drei Vorteile beim Einsatz einer Dokumentendatenbank gegenüber einer relationalen Datenbank. Beziehe jeden Vorteil auf RatzFahrt. (9 Punkte)

Je Vorteil 3 Punkte (Vorteil 1 Punkt, Erläuterung 1 Punkt, Bezug zu RatzFahrt 1 Punkt). Drei aus:

  • Flexibles Datenmodell (Schema): Dokumente einer Collection können unterschiedliche Felder haben; neue Felder lassen sich ohne Schemaänderung und ohne Ausfallzeit ergänzen. Bezug: Die frei wählbaren Zusatzmerkmale der Fahrtangebote und die Daten der neuen Schulen (z. B. andere Klassenbezeichnungen) lassen sich speichern, ohne für jedes Merkmal die Tabelle angebot zu ändern; neue Funktionen sind schneller umgesetzt.

  • Schnelle Abfragen zusammengehöriger Daten: Alles, was zu einem Objekt gehört, liegt in einem Dokument; ein Lesezugriff genügt, es sind keine JOINs nötig. Bezug: Die Detailansicht eines Fahrtangebots mit Haltepunkt, Fahrzeug und Merkmalen wird mit einem Zugriff geladen – wichtig, wenn mehr Schulen und Flurmonitore gleichzeitig abfragen.

  • Einfachere Entwicklung: Das JSON-ähnliche Format entspricht den Objekten im Programm; es wird weniger Code zum Umwandeln zwischen Tabellen und Objekten gebraucht. Bezug: Die App erhält über die REST-API ohnehin JSON; ein Chatverlauf oder ein Angebot kann nahezu unverändert gespeichert und ausgeliefert werden.

  • Horizontale Skalierung und Verfügbarkeit: Die Daten können auf viele Server verteilt und an mehreren Standorten gespiegelt werden; fällt ein Server aus, bleibt das System erreichbar. Bezug: Mit drei Schulen steigen Datenmenge und Zugriffe; die geplanten Server in zwei Rechenzentren können sich die Last teilen und sich gegenseitig vertreten.

Weitere Vorteile, die sich aus dem Text ergeben, sind möglich.

ab) Andrea Wolf, Datenschutzbeauftragte und Administratorin der App, ist skeptisch: „Wenn die Datenbank jedes beliebige Feld annimmt, haben wir nach einem Jahr Chaos in den Daten.“ Nenne zwei Probleme, die durch ein flexibles Schema für die Datenqualität entstehen können, und eine Gegenmaßnahme. (3 Punkte)

Je Nennung 1 Punkt. Probleme, z. B.:

  • uneinheitliche Feldnamen für dieselbe Angabe (freiePlaetze, freie_plaetze, plaetze), sodass Abfragen Dokumente übersehen,

  • wechselnde Datentypen ("freiePlaetze": "2" als Text neben 2 als Zahl), sodass Vergleiche wie „größer als 0“ falsch ausgehen,

  • fehlende Pflichtfelder (Angebot ohne Haltepunkt oder Uhrzeit),

  • unterschiedliche Schreibweisen frei eingegebener Merkmale („Fahrradträger“, „Radträger“, „Fahrrad-Träger“),

  • ungewollt gespeicherte personenbezogene Daten in zusätzlichen Feldern (Datenminimierung).

Gegenmaßnahmen, z. B.: Schemavalidierung der Datenbank (JSON Schema mit Pflichtfeldern und Datentypen), Prüfung der Eingaben im Backend vor dem Speichern, feste Auswahlliste für Merkmale statt Freitext, dokumentiertes Datenmodell.

b) Jonas Wolff aus dem FIA-Projektteam möchte wissen, worin sich die bisherige relationale Datenbank und eine dokumentenorientierte NoSQL-Datenbank unterscheiden. Gib für die vier Kriterien in der Tabelle die jeweilige Ausprägung an. (8 Punkte)

Kriterium relationale Datenbank (SQL) dokumentenorientierte Datenbank (NoSQL)
Datenmodell (Art der Speicherung)
Schema
Skalierung
Transaktionen und Konsistenz

Je Ausprägung 1 Punkt:

Kriterium relationale Datenbank (SQL) dokumentenorientierte Datenbank (NoSQL)
Datenmodell Tabellen aus Zeilen und Spalten, Beziehungen über Fremdschlüssel (normalisiert) Dokumente (JSON/BSON) in Collections, verschachtelt, zusammengehörige Daten eingebettet
Schema fest, vorab definiert (statisch); Änderung per ALTER TABLE flexibel, je Dokument verschieden (dynamisch)
Skalierung vor allem vertikal (größerer Server, scale up) vor allem horizontal (mehr Server, scale out, Sharding)
Transaktionen und Konsistenz ACID; strenge Konsistenz und referentielle Integrität durch das DBMS ursprünglich BASE (eventually consistent); Konsistenz zwischen Dokumenten oft Aufgabe der Anwendung (heute teilweise auch ACID-Transaktionen)

Andere sinnvolle Formulierungen sind richtig. Auch andere Kriterien wären möglich gewesen, z. B. Abfragesprache (standardisiertes SQL ↔ herstellerspezifische API) oder Redundanz (gering durch Normalisierung ↔ bewusst höher durch Einbetten).

c) Thomas Becker hat gelesen, dass es verschiedene Arten von NoSQL-Datenbanken gibt. Ordne jedem Datenbestand die am besten passende Art zu (Schlüssel-Wert-, Dokument-, Spaltenfamilien- oder Graphdatenbank) und begründe Deine Zuordnung kurz. (8 Punkte)

Nr. Datenbestand Art der NoSQL-Datenbank Begründung
1 Anmeldesitzungen der App: zu jedem Sitzungstoken die Nutzer-ID und die Ablaufzeit; wird bei jedem Klick gelesen
2 Fahrtangebote mit Haltepunkt, Uhrzeit, freien Plätzen und einer unterschiedlichen Zahl frei wählbarer Zusatzmerkmale
3 Statusmeldungen der zwölf Monitor-Player der drei Schulen (vier je Schule; alle 30 Sekunden Temperatur, Speicher, Erreichbarkeit), aufbewahrt für zwei Jahre
4 Haltepunkte und die Straßenverbindungen zwischen ihnen, um Routen mit Zwischenhalten zu berechnen

Je Zeile 2 Punkte (Zuordnung 1 Punkt, Begründung 1 Punkt):

Nr. Art Begründung
1 Schlüssel-Wert-Datenbank einfacher Zugriff über einen eindeutigen Schlüssel (Token), sehr schnell, meist im Arbeitsspeicher; Ablaufzeit (TTL) direkt unterstützt; Inhalt muss nicht durchsucht werden
2 Dokumentendatenbank jedes Angebot ist ein zusammengehöriges Objekt; unterschiedliche Merkmale ohne festes Schema; Abfragen über Felder (Ort, Richtung, Merkmal) möglich
3 Spaltenfamilien-Datenbank (auch: Zeitreihendatenbank) sehr viele, gleichförmige Schreibzugriffe (rund 12,6 Mio. Meldungen pro Jahr bei zwölf Playern), große Datenmenge, auf mehrere Server verteilbar; gelesen wird nach Player und Zeitraum
4 Graphdatenbank Haltepunkte als Knoten, Verbindungen als Kanten (mit Entfernung); Wege über mehrere Zwischenhalte lassen sich direkt abfragen, statt viele rekursive JOINs zu schreiben

Nachrechnung zu 3 (zur Einordnung, nicht gefordert): 2 Meldungen pro Minute · 60 · 24 · 365 = 1.051.200 Meldungen je Player und Jahr; bei zwölf Playern (vier je Schule) 12.614.400, also rund 12,6 Mio.

Andere Zuordnungen mit stimmiger Begründung sind möglich (z. B. 3 als Dokumentendatenbank mit Zeitreihen-Collection).

d) Svenja Krämer erklärt: „Wenn die Datenbank in zwei Rechenzentren läuft und die Verbindung zwischen ihnen kurz ausfällt, müssen wir entscheiden, was die App dann tun soll.“

da) Erläutere, warum es in einer verteilten Datenbank schwierig ist, alle ACID-Eigenschaften einzuhalten und gleichzeitig eine hohe Verfügbarkeit zu erreichen. (3 Punkte)

  • Bei verteilten Daten liegen Kopien auf mehreren Servern. Damit alle Server immer denselben, aktuellen Stand liefern (Konsistenz), muss jede Änderung vor dem Bestätigen mit allen Kopien abgestimmt werden (1 Punkt).

  • Fällt die Netzwerkverbindung zwischen den Rechenzentren aus, ist diese Abstimmung nicht möglich. Das System muss dann entweder Anfragen ablehnen (konsistent, aber nicht verfügbar) oder mit dem eigenen, evtl. veralteten Stand weiterarbeiten (verfügbar, aber nicht konsistent) (1 Punkt).

  • Beides zugleich ist bei einer Netzwerkstörung nicht möglich (CAP-Theorem: Consistency, Availability, Partition tolerance). Zudem verlangsamt die Abstimmung jede Transaktion (Sperren, Bestätigung über mehrere Server). Viele NoSQL-Systeme verzichten daher auf strenge Konsistenz und arbeiten nach BASE (basically available, soft state, eventually consistent) (1 Punkt).

db) Beurteile für die beiden folgenden Funktionen, ob es tragbar ist, wenn die Datenbank für einige Sekunden einen veralteten Stand liefert (eventual consistency). Begründe jeweils. (4 Punkte)

  1. Die Flurmonitore zeigen die offenen Fahrtangebote des nächsten Schultags an.
  2. Eine Mitfahrerin bucht den letzten freien Platz eines Angebots.

Je Funktion 2 Punkte (Urteil 1 Punkt, Begründung 1 Punkt):

  1. Tragbar. Die Anzeige ist ohnehin nur eine Übersicht und wird regelmäßig neu geladen (die Monitore fragen etwa einmal pro Minute ab). Zeigt ein Monitor ein gerade volles Angebot einige Sekunden zu lange, entsteht kein Schaden; gebucht wird ohnehin in der App. Wichtiger ist, dass die Anzeige auch bei einer Störung überhaupt etwas zeigt (Verfügbarkeit).

  2. Nicht tragbar. Würden zwei Server gleichzeitig den „letzten freien Platz“ vergeben, wäre das Angebot überbucht; eine Person stünde am Haltepunkt ohne Platz. Die Buchung braucht strenge Konsistenz (atomares Prüfen und Herabsetzen der freien Plätze in einer Transaktion), lieber eine Fehlermeldung „bitte später erneut versuchen“ als eine Doppelbuchung. Deshalb bleibt die Buchung in der relationalen Datenbank bzw. läuft als Transaktion, die nur ein führender Knoten (primary) in einem Rechenzentrum bestätigt; ist die Verbindung gestört, nimmt das andere Rechenzentrum keine Buchungen an. Eine Bestätigung durch die Mehrheit der Knoten setzt mindestens drei Knoten voraus, z. B. einen dritten Standort als Schiedsknoten.

e) Der Schulträger möchte jeden Monat die anonyme Fahrtstatistik der drei Schulen erhalten (je Haltepunkt und Richtung: Zahl der Angebote, Mitfahrten und Personenkilometer). Sie soll in die Tabellenkalkulation der Verwaltung übernommen und zusätzlich über eine REST-API an das Mobilitätsportal des Kreises übergeben werden. Zur Wahl stehen die Formate JSON, XML und CSV.

ea) Beschreibe den gemeinsamen Vorteil dieser drei Datenaustauschformate. (3 Punkte)

JSON, XML und CSV sind offene, textbasierte Formate, die nicht an einen Hersteller, ein Betriebssystem oder eine Programmiersprache gebunden sind (1 Punkt). Deshalb kann nahezu jedes System sie erzeugen und einlesen – hier die Datenbank der Schule, die Tabellenkalkulation der Verwaltung und das Mobilitätsportal (1 Punkt). Außerdem sind sie für Menschen mit einem einfachen Texteditor lesbar und prüfbar und lassen sich verlustfrei übertragen (1 Punkt).

eb) Nenne jeweils zwei Merkmale der Datenformate XML und JSON. (4 Punkte)

Je Merkmal 1 Punkt, z. B.:

XML

  • textbasiertes, hierarchisches Format (Baum aus Elementen),

  • Elemente werden durch Start- und Endtag ausgezeichnet, zusätzlich Attribute,

  • Struktur und Datentypen über DTD bzw. XML-Schema (XSD) prüfbar,

  • Namensräume, Kommentare; häufig bei SOAP-Webservices und Branchenstandards (z. B. E-Rechnung).

JSON

  • textbasiertes, hierarchisches Format aus Objekten { } mit Schlüssel-Wert-Paaren und Arrays [ ],

  • eigene Datentypen (string, number, boolean, null),

  • kompakt, keine Endtags, direkt in JavaScript nutzbar,

  • Standardformat von REST-Webservices.

ec) Erläutere zu den Formaten CSV und JSON jeweils einen Aspekt, der für ihre Verwendung in diesem Fall spricht. (4 Punkte)

Je Format 2 Punkte (Aspekt 1 Punkt, Erläuterung mit Bezug 1 Punkt), z. B.:

  • CSV: Die Statistik ist eine flache Tabelle (eine Zeile je Monat, Haltepunkt und Richtung). CSV hat fast keinen Overhead und lässt sich direkt in der Tabellenkalkulation der Verwaltung öffnen und weiterrechnen. (Absprachen nötig zu Trennzeichen, Dezimaltrennzeichen und Zeichenkodierung, z. B. UTF-8 wegen „Gütersloh“.)

  • JSON: Das Mobilitätsportal erwartet die Daten über eine REST-API; JSON ist dort das übliche Format (application/json) und wird von fast allen Programmiersprachen und Standardprogrammen ohne Zusatzaufwand verarbeitet. Zahlen bleiben Zahlen (Datentypen), und die Statistik kann verschachtelt übergeben werden (z. B. je Schule ein Array von Haltepunkten).

f) Für die Zusatzmerkmale testet das Team eine Dokumentendatenbank (MongoDB). Die Collection angebote enthält unter anderem diese Dokumente:

Aylin Kaya sucht eine Fahrt ab Gütersloh zur Schule, bei der sie ihr Fahrrad für den Weg zum Ausbildungsbetrieb mitnehmen kann. Die App stellt dafür folgende Abfrage:

Gib an, welche Dokumente die Abfrage liefert, und begründe für jedes andere Dokument, warum es nicht im Ergebnis erscheint. (4 Punkte)

Ergebnis: die Dokumente 101 und 106 (1 Punkt). Bei einem Array-Feld ist die Bedingung merkmale: "Fahrradträger" erfüllt, wenn das Array den Wert enthält – die Position im Array spielt keine Rolle (106).

Nicht im Ergebnis (je 0,75 Punkte, insgesamt 3 Punkte):

  • 102: freiePlaetze ist 0, die Bedingung $gt: 0 („größer als 0“) ist nicht erfüllt.

  • 103: Das Feld merkmale fehlt; ein fehlendes Feld erfüllt die Gleichheitsbedingung nicht.

  • 104: Richtung „nach Hause“ statt „zur Schule“.

  • 105: Haltepunkt in Herford; "haltepunkt.ort" greift per Punktnotation auf das Feld ort im eingebetteten Objekt haltepunkt zu.

Zum Vergleich in SQL (bei einer Tabelle angebot_merkmal):


Hinweis zur Nachnutzung als Open Educational Resource (OER)

Dieser Artikel und seine Texte, Bilder, Grafiken, Code und sonstiger Inhalt sind - sofern nicht anders angegeben - lizenziert unter CC BY 4.0. Nennung gemäß TULLU-Regel bitte wie folgt: “Übungsaufgaben zu NoSQL, Dokumentendatenbanken und JSON” von oer-informatik.de (H. Stein), Lizenz: CC BY 4.0. Der Artikel wurde unter https://oer-informatik.de/nosql-json-uebungsaufgaben veröffentlicht, die Quelltexte sind in weiterverarbeitbarer Form verfügbar im Repository unter https://gitlab.com/oer-informatik/db-design/datenbankentwurf. Erstellt mit KI-Assistenz; von mir umfassend redaktionell überarbeitet, geprüft und freigegeben. Stand: 27.10.2026.

[Kommentare zum Artikel lesen, schreiben] / [Artikel teilen] / [gitlab-Issue zum Artikel schreiben]

Kommentare gerne per Mastodon, Verbesserungsvorschläge per gitlab issue (siehe oben). Beitrag teilen: