Zum Inhalt

M165 NoSQL Datenbanken | Block 03

Inhaltsverzeichnis

Welches DBMS

CAP Theorem

JSON

Abfragen aus DB

Welches DMBS?

CAP Theorem

Kategorie Eigenschaften Verzichtet auf Typische Beispiele
CPKonsistenz + Partitionstoleranz - Daten bleiben korrekt- System toleriert Netzwerkausfälle- Teile des Systems können offline sein A – Verfügbarkeit - Finanzsysteme- Geldautomaten (ATM)- kritische Buchungssysteme
APVerfügbarkeit + Partitionstoleranz - Sehr hohe Verfügbarkeit- Funktioniert trotz Netzwerkausfällen- Antworten können veraltet oder inkonsistent sein C – strikte Konsistenz - DNS- Social Media (Twitter, Facebook)- viele Cloud-Systeme
CAKonsistenz + Verfügbarkeit - Sofort konsistente Daten- Immer verfügbar solange keine Partition entsteht P – Partitionstoleranz - RDBMS-Cluster (klassisch, ohne harte geografische Verteilung)

Was bedeutet „Eventual Consistency“?

„Eventual Consistency“ bedeutet, dass Daten nach Änderungen nicht sofort, aber mit der Zeit wieder auf allen Knoten übereinstimmen.
Kurzzeitig kann es Unterschiede geben, langfristig entsteht wieder Konsistenz.

Unterschiede zwischen CP-, AP- und CA-Datenbanken

Typ Erfüllt Verzichtet auf Kurz erklärt
CP Konsistenz + Partitionstoleranz Verfügbarkeit Korrekte Daten wichtiger als ständige Erreichbarkeit
AP Verfügbarkeit + Partitionstoleranz Strikte Konsistenz Immer erreichbar, Daten können kurz inkonsistent sein
CA Konsistenz + Verfügbarkeit Partitionstoleranz Nur möglich, wenn keine Netzwerkpartitionen auftreten
CP – Konsistenz wichtiger als Verfügbarkeit

CP-Systeme bleiben korrekt, selbst wenn sie dafür nicht erreichbar sind.
Typisch für Banken oder Finanzsysteme.

AP – Verfügbarkeit über allem

AP-Systeme bleiben immer erreichbar, auch wenn Daten während einer Partition veraltet oder abweichend sein können.
Danach erfolgt die Eventual Consistency.
Beispiel: DNS, Social Media.

CA – nur ohne Netzwerkpartitionen möglich

CA ist nur möglich, wenn im System praktisch nie echte Partitionen vorkommen.
Beispiel: klassische RDBMS-Cluster im selben Rechenzentrum.

Merken

  • CP → lieber korrekt als erreichbar
  • AP → lieber erreichbar als sofort konsistent
  • CA → korrekt + erreichbar, aber nur ohne Partitionen

Crosswords

Begriffe Übersicht

Begriff Beschreibung
KONSISTENZ Alle Knoten haben dieselben Daten zur gleichen Zeit.
ISOLATION Parallele Transaktionen beeinflussen sich nicht gegenseitig.
BASE Lockeres Konsistenzmodell im Gegensatz zu ACID.
DAUERHAFTIGKEIT Erfolgreiche Transaktionen bleiben dauerhaft gespeichert.
JSON Einfaches Schlüssel-Wert-Datenformat für Webanwendungen.
PARTITIONSTOLERANZ System bleibt trotz Netzwerkausfällen funktionsfähig.
B-TREE Baumartige Datenstruktur für schnelle Datenbanksuchen.
VERFÜGBARKEIT Jeder Client erhält garantiert eine Antwort, auch bei Knotenausfällen.
AP NoSQL-Kategorie: Verfügbarkeit + Partitionstoleranz, weniger Konsistenz.
ACID Strenges Transaktionsmodell in klassischen RDBMS.

Unterschied

  • Dokumenten-orientiert: Speichert Daten als Dokumente (z. B. JSON/BSON). Beispiel: MongoDB.

  • Key-Value-Speicher: Einfache Zuordnung von Schlüsseln zu Werten (sehr schnell). Beispiel: Redis.

  • Spalten-orientiert (Wide Column): Optimiert für das Lesen großer Datenmengen über bestimmte Spalten. Beispiel: Cassandra.

  • Graph-Datenbanken: Fokus auf Beziehungen zwischen Datenpunkten (Knoten und Kanten). Beispiel: Neo4j.

JSON

JSON Struktur

{"employees":[  
  { "firstName":"John", "lastName":"Doe" },  
  { "firstName":"Anna", "lastName":"Smith" },  
  { "firstName":"Peter", "lastName":"Jones" }  
]}  

Fragen

Squad Beispiel

squad = {  
      "squadName": "Super hero squad",  
      "homeTown": "Metro City",  
      "formed": 2016,  
      "secretBase": "Super tower",  
      "active": true,  
      "members": [  
        {  
          "name": "Molecule Man",  
          "age": 29,  
          "secretIdentity": "Dan Jukes",  
          "powers": [  
            "Radiation resistance",  
            "Turning tiny",  
            "Radiation blast"  
          ]  
        },  
        {  
          "name": "Madame Uppercut",  
          "age": 39,  
          "secretIdentity": "Jane Wilson",  
          "powers": [  
            "Million tonne punch",  
            "Damage resistance",  
            "Superhuman reflexes"  
          ]  
        },  
        {  
          "name": "Eternal Flame",  
          "age": 1000000,  
          "secretIdentity": "Unknown",  
          "powers": [  
            "Immortality",  
            "Heat Immunity",  
            "Inferno",  
            "Teleportation",  
            "Interdimensional travel"  
          ]  
        }  
      ]  
    };

    squad.squadName;            //ergibt "Super hero squad"  
    squad.members[0].name;      //ergibt "Molecule Man"  
    squad.members[1].age;       //ergibt 39  
    squad.members[2].powers[1]; //ergibt "Heat Immunity"

JSON PUML

JSON-Struktur des "squad"-Objekts (mit Erklärungen)squad (Objekt)→ Oberstes JSON-Element  squadName = "Super hero squad" «String»  homeTown = "Metro City" «String»  formed = 2016 «Number»  secretBase = "Super tower" «String»  active = true «Boolean»members (Array)→ Liste mit 3 Objekten  [0]  [1]  [2]members[0]→ Molecule Man(JSON-Objekt)  name = "Molecule Man" «String»  age = 29 «Number»  secretIdentity = "Dan Jukes" «String»powers (Array)→ Fähigkeiten  - Radiation resistance  - Turning tiny  - Radiation blastmembers[1]→ Madame Uppercut  name = "Madame Uppercut"  age = 39  secretIdentity = "Jane Wilson"powers (Array)  - Million tonne punch  - Damage resistance  - Superhuman reflexesmembers[2]→ Eternal Flame  name = "Eternal Flame"  age = 1000000  secretIdentity = "Unknown"powers (Array)  - Immortality  - Heat Immunity  - Inferno  - Teleportation  - Interdimensional travelenthälterstes Elementbesitzt powerszweites Elementbesitzt powersdrittes Elementbesitzt powers
400. Welcome to PlantUML! You can start with a simple UML Diagram like: Bob->Alice: Hello Or class Example You will find more information about PlantUML syntax onhttps://plantuml.com (Details by typinglicensekeyword) PlantUML version 1.2026.3beta5 / f567ad8 [2026-03-18 20:20:26 UTC][From string (line 2) ] @startuml!include https://raw.githubusercontent.com/MikhailKravets/mkdocs_puml/master/themes/default/dark.pumlCannot open URL

1. Welche Art von Datenstruktur ist das äussere Element des JSON-Beispiels?

  • Das äussere Element ist ein JSON-Objekt, erkennbar an {}.
  • Es enthält mehrere Schlüssel-Wert-Paare.

2. Wie viele Schlüssel enthält das äussere JSON-Objekt und wie heissen sie?

  • Es gibt 4 Schlüssel.
  • Sie heissen: squadName, formed, active und members.

3. Welchen Datentyp haben die Werte der Schlüssel squadName, formed und active?

  • squadName ist ein String, formed eine Number, active ein Boolean.
  • Diese Typen entsprechen dem JSON-Standard.

4. Was befindet sich in der Liste, die unter dem Schlüssel members gespeichert ist?

  • Unter members liegt ein Array.
  • Dieses Array enthält mehrere JSON-Objekte, je eines pro Mitglied.

5. Wie greift man auf den Namen des zweiten Mitglieds in der members-Liste zu?

  • Zugriff per Index und Schlüsselnamen: members[1].name.
  • Arrays beginnen bei Index 0.

6. Welchen Datentyp hat powers und woraus besteht dieses Element?

  • powers ist ein Array.
  • Es besteht aus mehreren Strings, die Fähigkeiten darstellen.

7. Welchen Datentyp hat der Wert von secretIdentity beim ersten Mitglied?

  • secretIdentity ist ein String.
  • Strings stehen in JSON immer in Anführungszeichen.

8. Warum stehen Zeichenketten in Anführungszeichen, Zahlen aber nicht?

  • Strings benötigen Anführungszeichen, damit sie als Text erkannt werden.
  • Zahlen stehen ohne Anführungszeichen, damit sie numerisch verarbeitet werden können.

9. Welche Unterschiede erkennst du zwischen den drei Objekten in der members-Liste?

  • Die Mitglieder unterscheiden sich in Namen, Rollen und Identitäten.
  • Auch die powers-Listen sind jeweils unterschiedlich.

10. Was passiert, wenn man in einem JSON-Objekt ein Komma zu viel oder zu wenig setzt?

  • Das JSON wird ungültig und erzeugt einen Parserfehler.
  • Die Datei kann dann nicht korrekt eingelesen werden.

Erste DB

Datenbank erstellen

Datenbank anlegen

use schuelerHub;

Daten einfügen

Einzelnen Datensatz einfügen (insertOne)
db.profiles.insertOne({
  "name": "Tim Langenauer",
  "klasse": "2FI",
  "interessen": ["Fussball", "YouTube"],
  "lieblingsApps": [
    { "name": "Minecraft", "typ": "Game" },
    { "name": "YouTube", "typ": "Video" },
    { "name": "Angular", "typ": "Coding" }
  ],
  "hatLaptop": true,
  "stundenProWocheOnline": 40
});


Mehrere Datensätze einfügen (insertMany)
db.profiles.insertMany([
  {
    "name": "Philipp Crista",
    "klasse": "2FI",
    "jahrgang": 2008,
    "interessen": ["Gaming", "Csharp", "GYM"],
    "lieblingsApps": [
      { "name": "Marktext", "typ": "Editor" },
      { "name": "Visual Studio", "typ": "Program" }
    ],
    "hatLaptop": true,
    "stundenProWocheOnline": 20
  },
  {
    "name": "Karel Drapal",
    "klasse": "2FI",
    "jahrgang": 2008,
    "interessen": ["Tennis", "Filme"],
    "lieblingsApps": [
      { "name": "Brawl Stars", "typ": "Game" },
      { "name": "YouTube", "typ": "Video" }
    ],
    "hatLaptop": true,
    "stundenProWocheOnline": 37
  },
  {
    "name": "Florin Gerig",
    "klasse": "2FI",
    "jahrgang": 2008,
    "interessen": ["Bouldern", "Cello", "Programmieren"],
    "lieblingsApps": [
      { "name": "Instagram", "typ": "Social" },
      { "name": "Minecraft", "typ": "Game" }
    ],
    "hatLaptop": true,
    "stundenProWocheOnline": 35
  },
  {
    "name": "Lars Hellstern",
    "klasse": "2FI",
    "jahrgang": 2007,
    "interessen": ["Autos", "Crypto", "Gambling"],
    "lieblingsApps": [
      { "name": "TikTok", "typ": "Social" },
      { "name": "Gemini", "typ": "KI" },
      { "name": "Snapchat", "typ": "Social" },
      { "name": "Spotify", "typ": "Musik" }
    ],
    "hatLaptop": true,
    "stundenProWocheOnline": 20
  },
  {
    "name": "Aldin",
    "klasse": "2FI",
    "jahrgang": 2008,
    "interessen": ["Programmieren", "Fussball", "Gaming"],
    "lieblingsApps": [
      { "name": "TikTok", "typ": "Social" },
      { "name": "Gemini", "typ": "AI" },
      { "name": "Fortnite", "typ": "Game" }
    ],
    "hatLaptop": true,
    "stundenProWocheOnline": 35
  }
]);

Abfragen aus der Datenbank

Alle Personen, die einen Laptop haben

db.profiles.find({ hatLaptop: true })


Schüler mit mindestens 21 Online-Stunden

db.profiles.find({ stundenProWocheOnline: { $gte: 21 } });


Nur Name + Klasse anzeigen

db.profiles.find(
  {},
  { name: 1, klasse: 1, _id: 0 }
);


Person löschen

db.profiles.deleteOne({ name: "Tim Langenauer" })

Daten ändern

Online-Stunden updaten

db.profiles.updateOne(
  { name: "Florin Gerig" },
  { $set: { stundenProWocheOnline: 67 } }
);


Allen Schülern ein neues Feld hinzufügen

db.profiles.updateMany(
  {},
  { $set: { machtIMS: true } }
);


Name ändern (Aldin → Aldin Musliu)

db.profiles.updateOne(
  { name: "Aldin" },
  { $set: { name: "Aldin Musliu" } }
)

db.profiles.find({ name: "Aldin Musliu" })