--- theme: seriph title: Ringstats – Zwischenpräsentation info: | ## Ringstats Zwischenstandspräsentation – Moderne Datenbanken Justin Rost · Michelle Reichelt · Yasin Ergün class: text-center transition: slide-left mdc: true fonts: sans: Inter mono: 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::
```text 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::
```js 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
```js weapon { id: 213, item_type: { id: 1, name: "Dolch" }, item_effect: { id: 4, name: "Stärke", value: 5 }, weight: 2, damage: 70 } ``` ```js enemy { id: 1, region_id: 1, name: "Tree_Sentinel", health: 30000, level: 20, damage: 70, items: [ 5, 10 ] } ``` ```js 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