---
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
---
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