668 lines
14 KiB
Markdown
Raw Permalink Normal View History

2026-05-31 13:31:05 +02:00
---
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
<div class="pt-6 opacity-80 text-lg">
Justin Rost · Michelle Reichelt · Yasin Ergün
</div>
<div class="pt-10 opacity-60 text-sm">
Zwischenpräsentation · Moderne Datenbanken · 08.06.2026
</div>
---
layout: center
class: text-center
---
# Inhalt
<div class="flex justify-center items-stretch gap-3 pt-14">
<div class="w-36 p-5 rounded-xl bg-gray-400/10">
<div class="text-4xl">🎯</div>
<div class="pt-3 font-semibold text-sm">Szenario</div>
</div>
2026-06-02 15:05:01 +02:00
<div class="flex items-center text-2xl opacity-40"></div>
2026-05-31 13:31:05 +02:00
<div class="w-36 p-5 rounded-xl bg-gray-400/10">
<div class="text-4xl">🗺️</div>
<div class="pt-3 font-semibold text-sm">ER-Modell</div>
</div>
2026-06-02 15:05:01 +02:00
<div class="flex items-center text-2xl opacity-40"></div>
2026-05-31 13:31:05 +02:00
<div class="w-36 p-5 rounded-xl bg-gray-400/10">
<div class="text-4xl">🧩</div>
<div class="pt-3 font-semibold text-sm">Drei Modelle</div>
</div>
<div class="flex items-center text-2xl opacity-40"></div>
<div class="w-36 p-5 rounded-xl bg-gray-400/10">
<div class="text-4xl">⚖️</div>
<div class="pt-3 font-semibold text-sm">Vergleich</div>
</div>
<div class="flex items-center text-2xl opacity-40"></div>
<div class="w-36 p-5 rounded-xl bg-red-400/10">
<div class="text-4xl"></div>
<div class="pt-3 font-semibold text-sm">Auswahl</div>
</div>
</div>
<!--
- kurzer Fahrplan durch die Präsentation
- erst Szenario, dann ER-Modell als Grundlage
- drei NoSQL-Modelle an unseren Daten zeigen
- vergleichen und am Ende eine Auswahl treffen
-->
---
layout: center
class: text-center
---
# Die Idee
<div class="opacity-70 pt-2">Eine Schnittstelle zwischen Spiel und Datenbank</div>
<div class="flex justify-center items-center gap-6 pt-12">
<div class="w-44 p-6 rounded-xl bg-gray-400/10">
<div class="text-5xl">🎮</div>
<div class="pt-3 font-semibold">Spiel</div>
<div class="pt-1 text-xs opacity-70">liest Position, Leben, Ausrüstung live aus</div>
</div>
<div class="text-3xl opacity-40"></div>
<div class="w-44 p-6 rounded-xl bg-red-400/10">
<div class="text-5xl">🗄️</div>
<div class="pt-3 font-semibold">Datenbank</div>
<div class="pt-1 text-xs opacity-70">speichert und liefert passende Infos</div>
</div>
<div class="text-3xl opacity-40"></div>
<div class="w-44 p-6 rounded-xl bg-gray-400/10">
<div class="text-5xl">🌐</div>
<div class="pt-3 font-semibold">Browser</div>
<div class="pt-1 text-xs opacity-70">gleiche Daten parallel abrufbar</div>
</div>
</div>
<!--
- Schnittstelle zwischen Spiel und Datenbank
- Im Spiel werden Daten ausgelesen
- Daten werden an Server gesendet und in DB verwalten
- Programm und Browser lesen Daten aus
-->
---
layout: default
---
# Kernidee: Hilfe für Spieler
<div class="grid grid-cols-2 gap-6 pt-10 text-center">
<div class="p-6 rounded-xl bg-gray-400/10">
<div class="text-4xl">🎮</div>
<div class="pt-3 font-semibold">Im-Spiel Anzeige</div>
<div class="pt-2 text-sm opacity-80">zeigt z.B. Bossangriffe live und Checkliste</div>
</div>
<div class="p-6 rounded-xl bg-gray-400/10">
<div class="text-4xl">🖥️</div>
<div class="pt-3 font-semibold">Browser App</div>
<div class="pt-2 text-sm opacity-80">Generelle Informationen und Analysen</div>
</div>
</div>
<div class="pt-8 text-center opacity-70">
Es muss extrem schnell gehen, ohne spürbare Verzögerung.
</div>
<!--
- Die Kernidee ist Hilfe für den Spieler
- Im Spiel wird Oberfläche angezeigt mit Informationen
- Browser App zeigt detaillreicher Infos zum Spieler und Welt
-->
---
layout: default
---
# Anwendungsfälle
<div class="grid grid-cols-3 gap-6 pt-12 text-center">
<div class="p-6 rounded-xl bg-gray-400/10">
<div class="text-5xl">⚔️</div>
<div class="pt-4 font-semibold">Bosskampf</div>
<div class="pt-2 text-sm opacity-70">Fenster mit Resistenzen und Angriffe</div>
</div>
<div class="p-6 rounded-xl bg-gray-400/10">
<div class="text-5xl">📦</div>
<div class="pt-4 font-semibold">Live-Standort</div>
<div class="pt-2 text-sm opacity-70">Checkliste, Truhen und Objekte in der Nähe</div>
</div>
<div class="p-6 rounded-xl bg-gray-400/10">
<div class="text-5xl">🌐</div>
<div class="pt-4 font-semibold">Website</div>
<div class="pt-2 text-sm opacity-70">Builds und Statistiken</div>
</div>
</div>
<!--
- Einige Informationen sind:
- Resistenzen und Angriffe von Bossen
- Truhen, Objekte und Checklisten in der Nähe
- Detaillierte Informationen zu Statistiken und Builds auf Website
-->
---
layout: default
---
# Das ER-Modell
<div class="flex justify-center pt-2">
<img src="/er-modell.png" class="h-100 rounded-lg bg-white p-2" />
</div>
<!--
- Zentrale Entity ist Player/Spieler
- Grear (Inventar) beinhaltet (Weapon, Armor, Shield, Talisman).
- Das sind alles Items, werden von Gegnern fallengelassen.
- In Regionen sind Player, Enemies und Items
-->
---
layout: center
class: text-center
---
# Drei NoSQL-Modelle
<div class="grid grid-cols-3 gap-8 pt-10">
<div class="p-8 rounded-xl bg-red-400/10">
<div class="text-3xl font-bold">Key-Value</div>
<div class="pt-3 opacity-80">Redis</div>
<div class="pt-2 text-sm opacity-70">Alles über Schlüssel</div>
</div>
<div class="p-8 rounded-xl bg-green-400/10">
<div class="text-3xl font-bold">Dokument</div>
<div class="pt-3 opacity-80">MongoDB</div>
<div class="pt-2 text-sm opacity-70">Alles im Dokument</div>
</div>
<div class="p-8 rounded-xl bg-blue-400/10">
<div class="text-3xl font-bold">Graph</div>
<div class="pt-3 opacity-80">Neo4j</div>
<div class="pt-2 text-sm opacity-70">Alles über Kanten</div>
</div>
</div>
<div class="pt-10 opacity-70">
Wir bilden die gleichen Daten in allen drei ab.
</div>
<!--
- Key-Value mit Redis: alles über Schlüssel
- Dokument mit MongoDB: alles im Dokument
- Graph mit Neo4j: alles über Kanten
- gleiche Daten in allen drei abgebildet
-->
---
layout: two-cols
layoutClass: gap-10
---
# Key-Value mit Redis
2026-06-02 15:00:58 +02:00
<div class="pt-8 text-lg space-y-4 opacity-80">
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
Keys sind Strings, eindeutig pro Objekt.
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
Aufbau: Entität : ID
</div>
2026-05-31 13:31:05 +02:00
::right::
<div class="pt-14">
```text
weapon:213
player:1
region:1:items
enemy:1
```
</div>
<!--
2026-06-02 15:05:01 +02:00
- Beim Key-Value-Modell läuft alles über Schlüssel
- Jeder Key ist ein String und steht für genau ein Objekt
- Aufbau ist einfach: Name der Entität, Doppelpunkt, ID
- Objekte speichern wir als Hash Map, Listen und Mengen als SET
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Key-Value: Schlüsselaufbau
<div class="text-sm pt-4">
| Datentyp | Key-Struktur | Attribute |
|----------|--------------|-----------|
2026-06-02 15:00:58 +02:00
| HMAP | `player:{id}` | id, name, health, level, region_id |
2026-05-31 13:31:05 +02:00
| SET | `player:{id}:armor` | item_id |
2026-06-02 15:00:58 +02:00
| HMAP | `enemy:{id}` | id, name, health, damage |
2026-05-31 13:31:05 +02:00
</div>
<div class="pt-4 opacity-70 text-sm">
2026-06-02 15:00:58 +02:00
Über den Key direkt ans Objekt.
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Jede Entität bekommt ihren eigenen Key
- Die Ausrüstung hängen wir über Sub-Keys dran, z.B. player:1:armor
- So kommen wir über den Key direkt ans Objekt, ganz ohne Suchen
2026-05-31 13:31:05 +02:00
-->
---
layout: two-cols
layoutClass: gap-10
---
# Dokument mit MongoDB
2026-06-02 15:00:58 +02:00
<div class="pt-8 text-lg space-y-4 opacity-80">
Zusammengehöriges in einem Dokument.
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
Jede Entität eine Collection.
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
Ausrüstung nur als ids.
</div>
2026-05-31 13:31:05 +02:00
::right::
<div class="pt-14">
```js
player {
id: 1,
name: "Jonas",
health: 100,
stamina: 100,
level: 1,
region_id: 1,
weapon: [ 12 ],
shield: 30,
armor: [ 41, 42 ],
talisman: [ 7 ]
}
```
</div>
<!--
2026-06-02 15:05:01 +02:00
- Beim Dokument-Modell packen wir Zusammengehöriges in ein Dokument
- Jede Entität bekommt ihre eigene Collection
- Vom Spieler aus halten wir bei der Ausrüstung nur die ids fest
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Dokument: Beispiele
<div class="grid grid-cols-3 gap-4 pt-6 text-sm">
```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 ]
}
```
</div>
<div class="pt-6 opacity-70 text-sm">
2026-06-02 15:00:58 +02:00
Weapon trägt item_type und item_effect direkt. Sonst meist nur ids.
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Die Weapon bringt item_type und item_effect direkt mit
2026-05-31 13:31:05 +02:00
- Enemy und Region verweisen über ids auf ihre Items
2026-06-02 15:05:01 +02:00
- Bei uns sind es also meist nur ids statt tiefer Verschachtelung
2026-05-31 13:31:05 +02:00
-->
---
layout: two-cols
layoutClass: gap-10
---
# Graph mit Neo4j
2026-06-02 15:00:58 +02:00
<div class="pt-8 text-lg space-y-4 opacity-80">
Fokus auf den Beziehungen.
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
Jede Entität ein Knoten mit eigenen Werten.
</div>
2026-05-31 13:31:05 +02:00
::right::
<div class="pt-6 text-sm">
| Knoten | Attribute |
|--------|-----------|
2026-06-02 15:00:58 +02:00
| Player | id, name, health, level |
2026-05-31 13:31:05 +02:00
| Weapon | id, weight, damage |
2026-06-02 15:00:58 +02:00
| Enemy | id, name, health, damage |
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Beim Graph-Modell liegt der Fokus auf den Beziehungen
- Jede Entität wird ein Knoten und trägt ihre Werte direkt
- Die Verbindungen kommen dann über die Kanten dazu
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Graph: Kanten
<div class="text-sm pt-6">
| Von | Kante | Nach |
|-----|-------|------|
2026-06-02 15:00:58 +02:00
| Player | has_equipped | Weapon |
2026-05-31 13:31:05 +02:00
| Player | is_in | Region |
2026-06-02 15:00:58 +02:00
| Region | has | Enemy |
2026-05-31 13:31:05 +02:00
| Enemy | drops | Item |
</div>
<div class="pt-6 opacity-70 text-sm">
2026-06-02 15:00:58 +02:00
Kanten wie im ER-Modell.
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Die Kanten sind genau die Beziehungen aus dem ER-Modell
- Zum Beispiel has_equipped, is_in, has und drops
- Damit lassen sich die Beziehungen direkt verfolgen
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Vergleich: Key-Value
<div class="grid grid-cols-2 gap-8 pt-10">
<div class="p-6 rounded-xl bg-green-500/10">
<div class="font-bold text-green-500 pb-3">Vorteil</div>
2026-06-02 15:00:58 +02:00
Extrem schnell, direkter Zugriff über Key. Ideal für Live Daten.
2026-05-31 13:31:05 +02:00
</div>
<div class="p-6 rounded-xl bg-red-500/10">
<div class="font-bold text-red-500 pb-3">Nachteil</div>
2026-06-02 15:00:58 +02:00
Komplexe Abfragen müssen wir selbst zusammenbauen.
2026-05-31 13:31:05 +02:00
</div>
</div>
<!--
2026-06-02 15:05:01 +02:00
- Der Vorteil ist das Tempo: über den Key direkt ans Objekt, ideal für Live-Daten
- Der Nachteil: komplexe Abfragen müssen wir selbst zusammenbauen
- Zum Beispiel alle Weapon mit einem bestimmten item_effect
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Vergleich: Dokument
<div class="grid grid-cols-2 gap-8 pt-10">
<div class="p-6 rounded-xl bg-green-500/10">
<div class="font-bold text-green-500 pb-3">Vorteil</div>
2026-06-02 15:00:58 +02:00
Leserlich und einfach zu modellieren.
2026-05-31 13:31:05 +02:00
</div>
<div class="p-6 rounded-xl bg-red-500/10">
<div class="font-bold text-red-500 pb-3">Nachteil</div>
2026-06-02 15:00:58 +02:00
Bei uns meist nur ids. Stärke kaum genutzt.
2026-05-31 13:31:05 +02:00
</div>
</div>
<!--
2026-06-02 15:05:01 +02:00
- Der Vorteil: sehr leserlich und einfach zu modellieren
- Der Nachteil: bei uns sind es meist nur ids, kaum verschachtelt
- Die eigentliche Stärke nutzen wir damit kaum aus
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Vergleich: Graph
<div class="grid grid-cols-2 gap-8 pt-10">
<div class="p-6 rounded-xl bg-green-500/10">
<div class="font-bold text-green-500 pb-3">Vorteil</div>
2026-06-02 15:00:58 +02:00
Beziehungen sehr leicht abfragbar, ohne Umwege.
2026-05-31 13:31:05 +02:00
</div>
<div class="p-6 rounded-xl bg-red-500/10">
<div class="font-bold text-red-500 pb-3">Nachteil</div>
2026-06-02 15:00:58 +02:00
Für uns überdimensioniert. Wir brauchen vor allem Tempo.
2026-05-31 13:31:05 +02:00
</div>
</div>
<!--
2026-06-02 15:05:01 +02:00
- Der Vorteil: Beziehungen lassen sich super leicht abfragen
- Etwa welcher Player welche Weapon trägt oder welches Item ein Enemy droppt
- Der Nachteil: für unseren Fall ist das überdimensioniert
- Wir brauchen schnelles Schreiben und Lesen, keine tiefen Abfragen
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
2026-06-02 15:05:01 +02:00
# Was bringt uns welches Modell?
<div class="grid grid-cols-3 gap-6 pt-12 text-center">
2026-05-31 13:31:05 +02:00
2026-06-02 15:05:01 +02:00
<div class="p-6 rounded-xl bg-red-400/10">
<div class="text-2xl font-bold">Key-Value</div>
<div class="pt-4 text-3xl"></div>
<div class="pt-3 text-sm opacity-80">Live-Daten des Players sofort lesen</div>
</div>
2026-05-31 13:31:05 +02:00
2026-06-02 15:05:01 +02:00
<div class="p-6 rounded-xl bg-green-400/10">
<div class="text-2xl font-bold">Dokument</div>
<div class="pt-4 text-3xl">📖</div>
<div class="pt-3 text-sm opacity-80">Ganzer Player mit Ausrüstung in einem Dokument</div>
</div>
<div class="p-6 rounded-xl bg-blue-400/10">
<div class="text-2xl font-bold">Graph</div>
<div class="pt-4 text-3xl">🔗</div>
<div class="pt-3 text-sm opacity-80">Welches Item ein Enemy droppt, direkt abfragbar</div>
</div>
2026-05-31 13:31:05 +02:00
</div>
2026-06-02 15:05:01 +02:00
<div class="pt-10 text-center opacity-70">
Wir brauchen vor allem Tempo.
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Key-Value gibt uns Tempo pur
- Dokument ist schön übersichtlich
- Graph ist stark bei den Beziehungen
- Für uns zählt am Ende vor allem das Tempo
2026-05-31 13:31:05 +02:00
-->
---
layout: default
---
# Was uns wichtig ist
2026-06-02 15:00:58 +02:00
<div class="pt-10 text-lg">
2026-05-31 13:31:05 +02:00
2026-06-02 15:00:58 +02:00
| | Redis | MongoDB | Neo4j |
2026-05-31 13:31:05 +02:00
|---|:---:|:---:|:---:|
2026-06-02 15:00:58 +02:00
| Performanz | 2 | 1 | 1 |
2026-06-02 15:05:01 +02:00
| Indexing | 1 | 1 | 1 |
| Latenz | 2 | 0 | 0 |
| ... weitere Kriterien | ... | ... | ... |
| **Summe** | **30** | **15** | **14** |
2026-05-31 13:31:05 +02:00
</div>
<div class="pt-6 opacity-70 text-sm">
2026-06-02 15:00:58 +02:00
Redis gewinnt klar.
2026-05-31 13:31:05 +02:00
</div>
<!--
2026-06-02 15:05:01 +02:00
- Wir haben Kriterien aus dem Szenario aufgestellt und gewichtet
- Performanz und keine Lizenzkosten sind für uns Pflicht
- Am Ende gewinnt Redis klar: 30 gegen 15 gegen 14
2026-05-31 13:31:05 +02:00
-->
---
layout: center
class: text-center
---
# Fazit
<div class="text-2xl pt-4">
Wir wählen <span class="text-red-500 font-bold">Key-Value mit Redis</span>
</div>
<div class="grid grid-cols-3 gap-6 pt-10 text-left text-sm">
<div class="p-5 rounded-xl bg-gray-400/10">
<div class="font-semibold pb-2">Geschwindigkeit</div>
2026-06-02 15:00:58 +02:00
Live schreiben und lesen.
2026-05-31 13:31:05 +02:00
</div>
<div class="p-5 rounded-xl bg-gray-400/10">
<div class="font-semibold pb-2">Direkter Zugriff</div>
2026-06-02 15:00:58 +02:00
Über den Key sofort ans Objekt.
2026-05-31 13:31:05 +02:00
</div>
<div class="p-5 rounded-xl bg-gray-400/10">
<div class="font-semibold pb-2">Passende Größe</div>
2026-06-02 15:00:58 +02:00
Flache Daten, keine tiefe Verschachtelung.
2026-05-31 13:31:05 +02:00
</div>
</div>
<!--
2026-06-02 15:05:01 +02:00
- Unsere Wahl fällt auf Key-Value mit Redis
- Drei Gründe: Geschwindigkeit, direkter Zugriff und die passende Größe
- Komplexe Abfragen brauchen wir bei uns kaum
2026-05-31 13:31:05 +02:00
-->
---
layout: center
class: text-center
---
2026-06-02 15:05:01 +02:00
# Danke fürs Zuhören
2026-05-31 13:31:05 +02:00
<div class="pt-10 opacity-60">
Fragen?
</div>
<div class="pt-8 opacity-50 text-sm">
Justin Rost · Michelle Reichelt · Yasin Ergün
</div>
<!--
2026-06-02 15:05:01 +02:00
- Danke fürs Zuhören
- Als nächstes setzen wir die Datenbank auf dem Server auf und bauen das Schema um
- Jetzt sind wir offen für eure Fragen
2026-05-31 13:31:05 +02:00
-->