2026-07-02 17:27:21 +02:00

14 KiB
Raw Blame History

theme title info class transition mdc fonts
seriph Ringstats Zwischenpräsentation ## Ringstats Zwischenstandspräsentation Moderne Datenbanken Justin Rost · Michelle Reichelt · Yasin Ergün text-center slide-left true
sans mono
Inter Fira Code

Ringstats

Eine Live Datenbank für Elden Ring

Justin Rost · Michelle Reichelt · Yasin Ergün
Zwischenpräsentation · Moderne Datenbanken · 08.06.2026

layout: center class: text-center

Inhalt

🎯
Szenario
🗺️
ER-Modell
🧩
Drei Modelle
⚖️
Vergleich
Auswahl

layout: center class: text-center

Die Idee

Eine Schnittstelle zwischen Spiel und Datenbank
🎮
Spiel
liest Position, Leben, Ausrüstung live aus
🗄️
Datenbank
speichert und liefert passende Infos
🌐
Browser
gleiche Daten parallel abrufbar

layout: default

Kernidee: Hilfe für Spieler

🎮
Im-Spiel Anzeige
zeigt z.B. Bossangriffe live und Checkliste
🖥️
Browser App
Generelle Informationen und Analysen
Es muss extrem schnell gehen, ohne spürbare Verzögerung.

layout: default

Anwendungsfälle

⚔️
Bosskampf
Fenster mit Resistenzen und Angriffe
📦
Live-Standort
Checkliste, Truhen und Objekte in der Nähe
🌐
Website
Builds und Statistiken

layout: default

Das ER-Modell


layout: center class: text-center

Drei NoSQL-Modelle

Key-Value
Redis
Alles über Schlüssel
Dokument
MongoDB
Alles im Dokument
Graph
Neo4j
Alles über Kanten
Wir bilden die gleichen Daten in allen drei ab.

layout: two-cols layoutClass: gap-10

Key-Value mit Redis

Keys sind Strings, eindeutig pro Objekt.

Aufbau: Entität : ID

::right::

weapon:213
player:1
region:1:items
enemy:1

layout: default

Key-Value: Schlüsselaufbau

Datentyp Key-Struktur Attribute
HMAP player:{id} id, name, health, level, region_id
SET player:{id}:armor item_id
HMAP enemy:{id} id, name, health, damage
Über den Key direkt ans Objekt.

layout: two-cols layoutClass: gap-10

Dokument mit MongoDB

Zusammengehöriges in einem Dokument.

Jede Entität eine Collection.

Ausrüstung nur als ids.

::right::

player {
  id: 1,
  name: "Jonas",
  health: 100,
  stamina: 100,
  level: 1,
  region_id: 1,
  weapon: [ 12 ],
  shield: 30,
  armor: [ 41, 42 ],
  talisman: [ 7 ]
}

layout: default

Dokument: Beispiele

weapon {
  id: 213,
  item_type: {
    id: 1,
    name: "Dolch"
  },
  item_effect: {
    id: 4,
    name: "Stärke",
    value: 5
  },
  weight: 2,
  damage: 70
}
enemy {
  id: 1,
  region_id: 1,
  name: "Tree_Sentinel",
  health: 30000,
  level: 20,
  damage: 70,
  items: [ 5, 10 ]
}
region {
  id: 1,
  name: "Limgrave",
  items: [ 12, 19, 248 ],
  enemies: [ 1, 245 ]
}
Weapon trägt item_type und item_effect direkt. Sonst meist nur ids.

layout: two-cols layoutClass: gap-10

Graph mit Neo4j

Fokus auf den Beziehungen.

Jede Entität ein Knoten mit eigenen Werten.

::right::

Knoten Attribute
Player id, name, health, level
Weapon id, weight, damage
Enemy id, name, health, damage

layout: default

Graph: Kanten

Von Kante Nach
Player has_equipped Weapon
Player is_in Region
Region has Enemy
Enemy drops Item
Kanten wie im ER-Modell.

layout: default

Vergleich: Key-Value

Vorteil
Extrem schnell, direkter Zugriff über Key. Ideal für Live Daten.
Nachteil
Komplexe Abfragen müssen wir selbst zusammenbauen.

layout: default

Vergleich: Dokument

Vorteil
Leserlich und einfach zu modellieren.
Nachteil
Bei uns meist nur ids. Stärke kaum genutzt.

layout: default

Vergleich: Graph

Vorteil
Beziehungen sehr leicht abfragbar, ohne Umwege.
Nachteil
Für uns überdimensioniert. Wir brauchen vor allem Tempo.

layout: default

Was bringt uns welches Modell?

Key-Value
Live-Daten des Players sofort lesen
Dokument
📖
Ganzer Player mit Ausrüstung in einem Dokument
Graph
🔗
Welches Item ein Enemy droppt, direkt abfragbar
Wir brauchen vor allem Tempo.

layout: default

Was uns wichtig ist

Redis MongoDB Neo4j
Performanz 2 1 1
Indexing 1 1 1
Latenz 2 0 0
... weitere Kriterien ... ... ...
Summe 30 15 14
Redis gewinnt klar.

layout: center class: text-center

Fazit

Wir wählen Key-Value mit Redis
Geschwindigkeit
Live schreiben und lesen.
Direkter Zugriff
Über den Key sofort ans Objekt.
Passende Größe
Flache Daten, keine tiefe Verschachtelung.

layout: center class: text-center

Danke fürs Zuhören

Fragen?
Justin Rost · Michelle Reichelt · Yasin Ergün