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