feature: praesi
This commit is contained in:
parent
63c7bb0315
commit
aa3e89407e
@ -248,11 +248,13 @@ layoutClass: gap-10
|
|||||||
|
|
||||||
# Key-Value mit Redis
|
# Key-Value mit Redis
|
||||||
|
|
||||||
Eine einfache und schnelle Lösung für unstrukturierte Daten.
|
<div class="pt-8 text-lg space-y-4 opacity-80">
|
||||||
|
|
||||||
Keys sind Strings und identifizieren ein Objekt eindeutig.
|
Keys sind Strings, eindeutig pro Objekt.
|
||||||
|
|
||||||
Aufbau: Name der Entität, Doppelpunkt, ID des Objekts.
|
Aufbau: Entität : ID
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
::right::
|
::right::
|
||||||
|
|
||||||
@ -267,12 +269,6 @@ enemy:1
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-6 opacity-80">
|
|
||||||
|
|
||||||
Die meisten Entitäten liegen als Hash Map. Listen und Mengen als SET.
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
- Keys sind Strings und identifizieren ein Objekt eindeutig
|
- Keys sind Strings und identifizieren ein Objekt eindeutig
|
||||||
- Aufbau: Name der Entität, Doppelpunkt, ID
|
- Aufbau: Name der Entität, Doppelpunkt, ID
|
||||||
@ -289,19 +285,14 @@ layout: default
|
|||||||
|
|
||||||
| Datentyp | Key-Struktur | Attribute |
|
| Datentyp | Key-Struktur | Attribute |
|
||||||
|----------|--------------|-----------|
|
|----------|--------------|-----------|
|
||||||
| HMAP | `weapon:{id}` | id, item_effect_id, item_type_id, weight, damage |
|
| HMAP | `player:{id}` | id, name, health, level, region_id |
|
||||||
| 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 |
|
| SET | `player:{id}:armor` | item_id |
|
||||||
| STRING | `player:{id}:shield` | item_id |
|
| HMAP | `enemy:{id}` | id, name, health, damage |
|
||||||
| HMAP | `region:{id}` | id, name |
|
|
||||||
| SET | `region:{id}:enemies` | enemy_id |
|
|
||||||
| HMAP | `enemy:{id}` | id, name, health, level, damage |
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-4 opacity-70 text-sm">
|
<div class="pt-4 opacity-70 text-sm">
|
||||||
Über den Key kommen wir direkt an ein Objekt, ohne lange zu suchen.
|
Über den Key direkt ans Objekt.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -317,11 +308,15 @@ layoutClass: gap-10
|
|||||||
|
|
||||||
# Dokument mit MongoDB
|
# Dokument mit MongoDB
|
||||||
|
|
||||||
Alles was zusammengehört, liegt gebündelt in einem Dokument.
|
<div class="pt-8 text-lg space-y-4 opacity-80">
|
||||||
|
|
||||||
Jede Entität wird zu einem Dokument in einer eigenen Collection.
|
Zusammengehöriges in einem Dokument.
|
||||||
|
|
||||||
Der Player hält von seiner Ausrüstung nur die ids fest, denn Weapon und Co. liegen in eigenen Dokumenten.
|
Jede Entität eine Collection.
|
||||||
|
|
||||||
|
Ausrüstung nur als ids.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
::right::
|
::right::
|
||||||
|
|
||||||
@ -399,7 +394,7 @@ region {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-6 opacity-70 text-sm">
|
<div class="pt-6 opacity-70 text-sm">
|
||||||
Weapon bringt item_type und item_effect direkt mit. Player, Item, Region und Enemy zeigen meist nur über ids.
|
Weapon trägt item_type und item_effect direkt. Sonst meist nur ids.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -415,9 +410,13 @@ layoutClass: gap-10
|
|||||||
|
|
||||||
# Graph mit Neo4j
|
# Graph mit Neo4j
|
||||||
|
|
||||||
Der Fokus liegt auf den Beziehungen zwischen den Objekten.
|
<div class="pt-8 text-lg space-y-4 opacity-80">
|
||||||
|
|
||||||
Jede Entität wird zu einem Knoten, der seine Werte direkt mitträgt.
|
Fokus auf den Beziehungen.
|
||||||
|
|
||||||
|
Jede Entität ein Knoten mit eigenen Werten.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
::right::
|
::right::
|
||||||
|
|
||||||
@ -425,13 +424,9 @@ Jede Entität wird zu einem Knoten, der seine Werte direkt mitträgt.
|
|||||||
|
|
||||||
| Knoten | Attribute |
|
| Knoten | Attribute |
|
||||||
|--------|-----------|
|
|--------|-----------|
|
||||||
| Player | id, name, health, stamina, level |
|
| Player | id, name, health, level |
|
||||||
| Weapon | id, weight, damage |
|
| Weapon | id, weight, damage |
|
||||||
| Type | id, name |
|
| Enemy | id, name, health, damage |
|
||||||
| item_effect | id, name, value |
|
|
||||||
| Item | id, name |
|
|
||||||
| Region | id, name |
|
|
||||||
| Enemy | id, name, health, level, damage |
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -450,18 +445,15 @@ layout: default
|
|||||||
|
|
||||||
| Von | Kante | Nach |
|
| Von | Kante | Nach |
|
||||||
|-----|-------|------|
|
|-----|-------|------|
|
||||||
| Player | has_equipped | Weapon, Armor, Shield, Talisman |
|
| Player | has_equipped | Weapon |
|
||||||
| Player | is_in | Region |
|
| Player | is_in | Region |
|
||||||
| Weapon, Armor, Shield | has | Type |
|
| Region | has | Enemy |
|
||||||
| Weapon, Armor, Shield, Talisman | has | item_effect |
|
|
||||||
| Weapon, Armor, Shield, Talisman | is | Item |
|
|
||||||
| Region | has | Item, Enemy |
|
|
||||||
| Enemy | drops | Item |
|
| Enemy | drops | Item |
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-6 opacity-70 text-sm">
|
<div class="pt-6 opacity-70 text-sm">
|
||||||
Die Kanten verbinden die Knoten so, wie es schon das ER-Modell vorgibt.
|
Kanten wie im ER-Modell.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -480,12 +472,12 @@ layout: default
|
|||||||
|
|
||||||
<div class="p-6 rounded-xl bg-green-500/10">
|
<div class="p-6 rounded-xl bg-green-500/10">
|
||||||
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
||||||
Redis ist extrem schnell. Über die Keys kommen wir direkt an ein Objekt. Genau das brauchen wir für die Live Daten des Players.
|
Extrem schnell, direkter Zugriff über Key. Ideal für Live Daten.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-6 rounded-xl bg-red-500/10">
|
<div class="p-6 rounded-xl bg-red-500/10">
|
||||||
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
||||||
Komplexe Abfragen sind schwierig. Alle Weapon mit einem bestimmten item_effect müssen wir in der Anwendung selbst zusammenbauen.
|
Komplexe Abfragen müssen wir selbst zusammenbauen.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -506,12 +498,12 @@ layout: default
|
|||||||
|
|
||||||
<div class="p-6 rounded-xl bg-green-500/10">
|
<div class="p-6 rounded-xl bg-green-500/10">
|
||||||
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
||||||
Sehr leserlich und einfach zu modellieren. Jedes Dokument ist für sich verständlich und man sieht direkt, welche Daten zusammengehören.
|
Leserlich und einfach zu modellieren.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-6 rounded-xl bg-red-500/10">
|
<div class="p-6 rounded-xl bg-red-500/10">
|
||||||
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
||||||
Bei uns wird das meiste über ids referenziert und nur wenig verschachtelt. Wir nutzen die Stärke des Modells kaum.
|
Bei uns meist nur ids. Stärke kaum genutzt.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -532,12 +524,12 @@ layout: default
|
|||||||
|
|
||||||
<div class="p-6 rounded-xl bg-green-500/10">
|
<div class="p-6 rounded-xl bg-green-500/10">
|
||||||
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
<div class="font-bold text-green-500 pb-3">Vorteil</div>
|
||||||
Beziehungen lassen sich sehr leicht abfragen. Welcher Player welche Weapon trägt oder welches Item ein Enemy fallen lässt, ohne Umwege.
|
Beziehungen sehr leicht abfragbar, ohne Umwege.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-6 rounded-xl bg-red-500/10">
|
<div class="p-6 rounded-xl bg-red-500/10">
|
||||||
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
<div class="font-bold text-red-500 pb-3">Nachteil</div>
|
||||||
Neo4j ist für unseren Fall überdimensioniert. Wir schreiben und lesen vor allem schnell, statt ständig tiefe Beziehungen abzufragen.
|
Für uns überdimensioniert. Wir brauchen vor allem Tempo.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -567,7 +559,7 @@ layout: default
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-8 opacity-70">
|
<div class="pt-8 opacity-70">
|
||||||
Unsere Daten sind flach und ändern sich ständig. Tiefe Beziehungen brauchen wir kaum.
|
Unsere Daten sind flach und ständig in Bewegung.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
@ -582,41 +574,25 @@ layout: default
|
|||||||
|
|
||||||
# Was uns wichtig ist
|
# Was uns wichtig ist
|
||||||
|
|
||||||
<div class="grid grid-cols-2 gap-8 pt-6 text-sm">
|
<div class="pt-10 text-lg">
|
||||||
|
|
||||||
<div>
|
| | Redis | MongoDB | Neo4j |
|
||||||
|
|
||||||
| Kriterium | Muss | Gewicht |
|
|
||||||
|-----------|:----:|:-------:|
|
|
||||||
| Hohe Performanz | ja | 5 |
|
|
||||||
| Keine Lizenzkosten | ja | 5 |
|
|
||||||
| Daten-Streaming | ja | 3 |
|
|
||||||
| Niedrige Latenz | ja | 3 |
|
|
||||||
| Indexing | nein | 2 |
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
|
|
||||||
| | MariaDB | Redis | MongoDB |
|
|
||||||
|---|:---:|:---:|:---:|
|
|---|:---:|:---:|:---:|
|
||||||
| Performanz | 0 | 2 | 1 |
|
| Performanz | 2 | 1 | 1 |
|
||||||
| Streaming | 0 | 2 | 0 |
|
| Streaming | 2 | 0 | 0 |
|
||||||
| Latenz | 1 | 2 | 0 |
|
| Latenz | 2 | 0 | 1 |
|
||||||
| **Summe** | **11** | **30** | **15** |
|
| **Summe** | **30** | **15** | **13** |
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pt-6 opacity-70 text-sm">
|
<div class="pt-6 opacity-70 text-sm">
|
||||||
Latenzfrei und performant ist für uns Pflicht. In den Tests gewinnt Redis klar.
|
Redis gewinnt klar.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
- Kriterien aus dem Szenario gewichtet
|
- Kriterien aus dem Szenario gewichtet
|
||||||
- Performanz und keine Lizenzkosten sind Pflicht
|
- Performanz und keine Lizenzkosten sind Pflicht
|
||||||
- in den Tests gewinnt Redis klar: 30 vs 11 vs 15
|
- in den Tests gewinnt Redis klar: 30 vs 15 vs 13
|
||||||
-->
|
-->
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -634,17 +610,17 @@ Wir wählen <span class="text-red-500 font-bold">Key-Value mit Redis</span>
|
|||||||
|
|
||||||
<div class="p-5 rounded-xl bg-gray-400/10">
|
<div class="p-5 rounded-xl bg-gray-400/10">
|
||||||
<div class="font-semibold pb-2">Geschwindigkeit</div>
|
<div class="font-semibold pb-2">Geschwindigkeit</div>
|
||||||
Daten des Players live schreiben und genauso live zurücklesen.
|
Live schreiben und lesen.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-5 rounded-xl bg-gray-400/10">
|
<div class="p-5 rounded-xl bg-gray-400/10">
|
||||||
<div class="font-semibold pb-2">Direkter Zugriff</div>
|
<div class="font-semibold pb-2">Direkter Zugriff</div>
|
||||||
Über die Keys sofort an ein Objekt, ohne lange Suche.
|
Über den Key sofort ans Objekt.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="p-5 rounded-xl bg-gray-400/10">
|
<div class="p-5 rounded-xl bg-gray-400/10">
|
||||||
<div class="font-semibold pb-2">Passende Größe</div>
|
<div class="font-semibold pb-2">Passende Größe</div>
|
||||||
Rund 100 Regionen, 500 Gegner, 3.300 Gegenstände. Keine tiefe Verschachtelung nötig.
|
Flache Daten, keine tiefe Verschachtelung.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user