MongoDB

  • Name von humongous = gigantisch (da geeignet für große Datenmengen)
  • verbreitet, besonders in Kombination mit NodeJS
  • JavaScript (+ zusätzliche Operatoren) für Verwaltung und Zugriff statt SQL
  • Speichert Daten im BSON Format
    • Binary JSON
    • optimiert für schnellen Zugriff und geringen Speicherbedarf
    • zusätzliche Datentypen, z. B. Datum

Datenbank Aufbau

Relational (dt/en)MongoDB
Datenbank / DatabaseDatabase
Tabelle / TableCollection
Zeile / RowDocument (16MB size limit)
Spalte / Columnbeliebig
ViewsViews

Jedes Document erhält automatisch eine _id als Schlüssel.

Datenmodell

  • Dokument hat kein festgelegtes Schema innerhalb einer Collection
  • Struktur von Dokumenten kann sich unterscheiden (z. B. bezüglich Attributen, Anzahl, Datentypen)
  • Struktur jedes Dokuments kann nachträglich individuell verändert werden
  • Normalerweise praktikabel, wenn Dokumente in Collections zumindest ähnliche Struktur aufweisen
  • Es kann eine Schema Validierung angegeben werden, um Vorgaben zur Struktur zu machen

eingebettet vs. normalisiert

  • Eingebettetes Datenmodell

    • Daten, die meist zusammen abgerufen/bearbeitet werden, zusammen speichern (in Dokument)
    • Denormalisierung: ein Datensatz in anderen eingebettet
    • Dopplung von Daten ist dabei erlaubt
    • Datenzugriff dadurch effizienter
  • Normalisiertes Datenmodell

    • Daten in eigenes Dokument/Collection auslagern wenn:

      • Daten nur selten zusammen abgerufen/bearbeitet werden (z. B. fast immer nur ein Teil benötigt)
      • bei komplexeren/größeren Datenstrukturen
    • Dokumente/Collections verbinden durch:

      • Referenz (wie ForeignKey bei SQL) als einzelner Wert oder mehrere in Array (maximale Größe berücksichtigen)
      • $lookup operator (wie JOIN) oder zwei Requests benötigt
    • Duplikation von Daten vermeiden -> in eigene Collection auslagern

Anmerkungen

  • Frage nach dem geeigneten Datenmodell durch Flexibilität ggf. schwieriger
  • Entscheidung abhängig von den verwendeten Abfragen und deren Häufigkeit
    • NoSQL: Applikation mit Abfragen zuerst, dann passendes Datenmodell
    • Relational: Datenmodell unabhängig von Applikation, dann passende Abfragen
  • Auf Effizienz ausgelegt
  • Konsistenz bei CRUD Operationen muss über Code gewährleistet werden

Beispiel Datenmodell

Collection student

  • {_id: ObjectId("1234ab"), studentNr: 123456, firstName: "Klaus", lastName: "Meng", semester: 2, faculty: "DM", course: "OMB", lecture_ids: [ObjectId("abc234"), ObjectId("5de678")]}
  • {_id: ObjectId("23bc45"), studentNr: 234567, firstName: "Verena", lastName: "Rist", semester: 6, faculty: "DM", course: "MIB"}
  • {_id: ObjectId("3412ce"), studentNr: 345678, firstName: "Samantha", lastName: "Holz", semester: 1, faculty: "DM", course: "OMB"}

Collection faculty

  • {_id: ObjectId("1122aa"), name:"DM", course:["MIB", "OMB", "MKB"]}
  • {_id: ObjectId("33ee55"), name:"IN"}

Collection lecture

  • {_id: ObjectId("abc234"), name: "C#", faculty: "IN", student_ids: [ObjectId("1234ab")]}
  • {_id: ObjectId("5de678"), name: "Zeichnen", faculty: "DM", student_ids: [ObjectId("1234ab")]}