2026-06-02 15:00:51 +02:00

15 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

Eine einfache und schnelle Lösung für unstrukturierte Daten.

Keys sind Strings und identifizieren ein Objekt eindeutig.

Aufbau: Name der Entität, Doppelpunkt, ID des Objekts.

::right::

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

Die meisten Entitäten liegen als Hash Map. Listen und Mengen als SET.


layout: default

Key-Value: Schlüsselaufbau

Datentyp Key-Struktur Attribute
HMAP weapon:{id} id, item_effect_id, item_type_id, weight, damage
HMAP item:{id} id, name, gear_type, gear_id
HMAP player:{id} id, name, health, stamina, level, region_id
SET player:{id}:armor item_id
STRING player:{id}:shield item_id
HMAP region:{id} id, name
SET region:{id}:enemies enemy_id
HMAP enemy:{id} id, name, health, level, damage
Über den Key kommen wir direkt an ein Objekt, ohne lange zu suchen.

layout: two-cols layoutClass: gap-10

Dokument mit MongoDB

Alles was zusammengehört, liegt gebündelt in einem Dokument.

Jede Entität wird zu einem Dokument in einer eigenen Collection.

Der Player hält von seiner Ausrüstung nur die ids fest, denn Weapon und Co. liegen in eigenen Dokumenten.

::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 bringt item_type und item_effect direkt mit. Player, Item, Region und Enemy zeigen meist nur über ids.

layout: two-cols layoutClass: gap-10

Graph mit Neo4j

Der Fokus liegt auf den Beziehungen zwischen den Objekten.

Jede Entität wird zu einem Knoten, der seine Werte direkt mitträgt.

::right::

Knoten Attribute
Player id, name, health, stamina, level
Weapon id, weight, damage
Type id, name
item_effect id, name, value
Item id, name
Region id, name
Enemy id, name, health, level, damage

layout: default

Graph: Kanten

Von Kante Nach
Player has_equipped Weapon, Armor, Shield, Talisman
Player is_in Region
Weapon, Armor, Shield has Type
Weapon, Armor, Shield, Talisman has item_effect
Weapon, Armor, Shield, Talisman is Item
Region has Item, Enemy
Enemy drops Item
Die Kanten verbinden die Knoten so, wie es schon das ER-Modell vorgibt.

layout: default

Vergleich: Key-Value

Vorteil
Redis ist extrem schnell. Über die Keys kommen wir direkt an ein Objekt. Genau das brauchen wir für die Live Daten des Players.
Nachteil
Komplexe Abfragen sind schwierig. Alle Weapon mit einem bestimmten item_effect müssen wir in der Anwendung selbst zusammenbauen.

layout: default

Vergleich: Dokument

Vorteil
Sehr leserlich und einfach zu modellieren. Jedes Dokument ist für sich verständlich und man sieht direkt, welche Daten zusammengehören.
Nachteil
Bei uns wird das meiste über ids referenziert und nur wenig verschachtelt. Wir nutzen die Stärke des Modells kaum.

layout: default

Vergleich: Graph

Vorteil
Beziehungen lassen sich sehr leicht abfragen. Welcher Player welche Weapon trägt oder welches Item ein Enemy fallen lässt, ohne Umwege.
Nachteil
Neo4j ist für unseren Fall überdimensioniert. Wir schreiben und lesen vor allem schnell, statt ständig tiefe Beziehungen abzufragen.

layout: default

Gegenüberstellung

Key-Value Dokument Graph
Schreiben und Lesen sehr schnell 🟡 gut 🟡 mehr Aufwand
Direkter Objektzugriff über Key über Collection 🟡 über Knoten
Komplexe Abfragen 🔴 schwierig 🟡 mittel stark
Passt zu Live Daten ideal 🟡 ok 🔴 überdimensioniert
Unsere Daten sind flach und ändern sich ständig. Tiefe Beziehungen brauchen wir kaum.

layout: default

Was uns wichtig ist

Kriterium Muss Gewicht
Hohe Performanz ja 5
Keine Lizenzkosten ja 5
Daten-Streaming ja 3
Niedrige Latenz ja 3
Indexing nein 2
MariaDB Redis MongoDB
Performanz 0 2 1
Streaming 0 2 0
Latenz 1 2 0
Summe 11 30 15
Latenzfrei und performant ist für uns Pflicht. In den Tests gewinnt Redis klar.

layout: center class: text-center

Fazit

Wir wählen Key-Value mit Redis
Geschwindigkeit
Daten des Players live schreiben und genauso live zurücklesen.
Direkter Zugriff
Über die Keys sofort an ein Objekt, ohne lange Suche.
Passende Größe
Rund 100 Regionen, 500 Gegner, 3.300 Gegenstände. Keine tiefe Verschachtelung nötig.

layout: center class: text-center

Danke

Nächste Schritte: Datenbank auf dem Server aufsetzen und Schema umsetzen
Fragen?
Justin Rost · Michelle Reichelt · Yasin Ergün