---
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
Keys sind Strings, eindeutig pro Objekt.
Aufbau: Entität : ID
::right::
```text
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::
```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 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
---
# 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 ständig in Bewegung.
---
layout: default
---
# Was uns wichtig ist
| | Redis | MongoDB | Neo4j |
|---|:---:|:---:|:---:|
| Performanz | 2 | 1 | 1 |
| Streaming | 2 | 0 | 0 |
| Latenz | 2 | 0 | 1 |
| **Summe** | **30** | **15** | **13** |
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
Nächste Schritte: Datenbank auf dem Server aufsetzen und Schema umsetzen
Fragen?
Justin Rost · Michelle Reichelt · Yasin Ergün