diff --git a/Ringstats_Dokumentation.aux b/Ringstats_Dokumentation.aux index fd87e117..9f07ee6f 100644 --- a/Ringstats_Dokumentation.aux +++ b/Ringstats_Dokumentation.aux @@ -37,13 +37,32 @@ \@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Vor- und Nachteile des Key-Value-Modells}{8}{subsection.3.1}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Vor- und Nachteile des dokumentenorientierten Modells}{8}{subsection.3.2}\protected@file@percent } \@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Vor- und Nachteile des Graph-Modells}{8}{subsection.3.3}\protected@file@percent } -\@writefile{tdo}{\contentsline {todo}{Wir koennten Regionen Traversierung Pathfinding einbauen}{8}{section*.1}\protected@file@percent } -\pgfsyspdfmark {pgfid1}{19562756}{23935922} -\@writefile{tdo}{\contentsline {todo}{Wir haben keine Beziehungen, die ueber mehrere Knoten hinweg gehen. Keine komlexen beziehungen wo der graph einen hohen nutzen mit sich bringt}{8}{section*.2}\protected@file@percent } -\pgfsyspdfmark {pgfid2}{19562756}{18172368} -\BKM@entry{id=13,dest={73656374696F6E2E34},srcline={340}}{5C3337365C3337375C303030465C303030615C3030307A5C303030695C30303074} -\@writefile{toc}{\contentsline {section}{\numberline {4}Fazit}{9}{section.4}\protected@file@percent } +\BKM@entry{id=13,dest={73756273656374696F6E2E332E34},srcline={340}}{5C3337365C3337375C303030465C303030615C3030307A5C303030695C30303074} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Fazit}{9}{subsection.3.4}\protected@file@percent } +\BKM@entry{id=14,dest={73656374696F6E2E34},srcline={368}}{5C3337365C3337375C3030304D5C303030615C303030725C3030306B5C303030745C303030725C303030655C303030635C303030685C303030655C303030725C303030635C303030685C30303065} +\BKM@entry{id=15,dest={73756273656374696F6E2E342E31},srcline={374}}{5C3337365C3337375C303030425C303030655C303030745C303030725C303030615C303030635C303030685C303030745C303030655C303030745C303030655C3030305C3034305C303030445C303030615C303030745C303030655C3030306E5C303030625C303030615C3030306E5C3030306B5C303030655C3030306E} +\BKM@entry{id=16,dest={73756273756273656374696F6E2E342E312E31},srcline={376}}{5C3337365C3337375C303030525C303030655C303030645C303030695C30303073} +\BKM@entry{id=17,dest={73756273756273656374696F6E2E342E312E32},srcline={384}}{5C3337365C3337375C3030304D5C303030655C3030306D5C303030635C303030615C303030635C303030685C303030655C30303064} +\BKM@entry{id=18,dest={73756273756273656374696F6E2E342E312E33},srcline={392}}{5C3337365C3337375C303030415C303030725C303030615C3030306E5C303030675C3030306F5C303030445C303030425C3030305C3034305C3030305C3035305C3030306D5C303030755C3030306C5C303030745C303030695C3030306D5C3030306F5C303030645C303030615C3030306C5C3030305C303531} +\BKM@entry{id=19,dest={73756273756273656374696F6E2E342E312E34},srcline={401}}{5C3337365C3337375C303030415C3030306D5C303030615C3030307A5C3030306F5C3030306E5C3030305C3034305C303030445C303030795C3030306E5C303030615C3030306D5C3030306F5C303030445C30303042} +\@writefile{toc}{\contentsline {section}{\numberline {4}Marktrecherche}{10}{section.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Betrachtete Datenbanken}{10}{subsection.4.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.1}Redis}{10}{subsubsection.4.1.1}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.2}Memcached}{10}{subsubsection.4.1.2}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.3}ArangoDB (multimodal)}{10}{subsubsection.4.1.3}\protected@file@percent } +\BKM@entry{id=20,dest={73756273756273656374696F6E2E342E312E35},srcline={410}}{5C3337365C3337375C303030655C303030745C303030635C30303064} +\BKM@entry{id=21,dest={73756273756273656374696F6E2E342E312E36},srcline={416}}{5C3337365C3337375C303030525C303030695C303030615C3030306B5C3030305C3034305C3030304B5C30303056} +\BKM@entry{id=22,dest={73756273656374696F6E2E342E32},srcline={422}}{5C3337365C3337375C3030304E5C303030755C303030745C3030307A5C303030775C303030655C303030725C303030745C303030615C3030306E5C303030615C3030306C5C303030795C303030735C30303065} +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.4}Amazon DynamoDB}{11}{subsubsection.4.1.4}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.5}etcd}{11}{subsubsection.4.1.5}\protected@file@percent } +\@writefile{toc}{\contentsline {subsubsection}{\numberline {4.1.6}Riak KV}{11}{subsubsection.4.1.6}\protected@file@percent } +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Nutzwertanalyse}{11}{subsection.4.2}\protected@file@percent } +\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces Nutzwertanalyse der sechs Key-Value-Datenbanken}}{11}{table.4}\protected@file@percent } +\newlabel{tab:nutzwertanalyse}{{4}{11}{Nutzwertanalyse der sechs Key-Value-Datenbanken}{table.4}{}} +\BKM@entry{id=23,dest={73756273656374696F6E2E342E33},srcline={457}}{5C3337365C3337375C303030445C303030615C303030745C303030655C3030306E5C303030625C303030615C3030306E5C3030306B5C303030615C303030755C303030735C303030775C303030615C303030685C3030306C} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Datenbankauswahl}{12}{subsection.4.3}\protected@file@percent } \global\@namedef{scr@dte@section@lastmaxnumwidth}{12.14694pt} \global\@namedef{scr@dte@subsection@lastmaxnumwidth}{19.70898pt} +\global\@namedef{scr@dte@subsubsection@lastmaxnumwidth}{28.84563pt} \@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} -\gdef \@abspage@last{9} +\gdef \@abspage@last{12} diff --git a/Ringstats_Dokumentation.fdb_latexmk b/Ringstats_Dokumentation.fdb_latexmk index b96d7276..a2ad5a5c 100644 --- a/Ringstats_Dokumentation.fdb_latexmk +++ b/Ringstats_Dokumentation.fdb_latexmk @@ -1,9 +1,12 @@ # Fdb version 4 -["pdflatex"] 1780313071.59521 "/home/hikyu/Documents/Uni/2026 Sommer/Moderne Datenbanken/Ringstats_Dokumentation.tex" "Ringstats_Dokumentation.pdf" "Ringstats_Dokumentation" 1780313072.62514 0 - "/home/hikyu/Documents/Uni/2026 Sommer/Moderne Datenbanken/Ringstats_Dokumentation.tex" 1780313071.55337 16584 03bd9bb6b9242fada2b5fd161766d7ed "" +["pdflatex"] 1783431678.04028 "/home/hikyu/Documents/Uni/2026 Sommer/Moderne Datenbanken/Ringstats_Dokumentation.tex" "Ringstats_Dokumentation.pdf" "Ringstats_Dokumentation" 1783431679.12842 0 + "/home/hikyu/Documents/Uni/2026 Sommer/Moderne Datenbanken/Ringstats_Dokumentation.tex" 1783431677.99026 22127 9c02fde45b05485b4d6e44f2a7e8ba1e "" "/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc" 1775415801 2971 def0b6c1f0b107b3b936def894055589 "" + "/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc" 1775415801 2900 1537cc8184ad1792082cd229ecc269f4 "" "/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1775415801 3524 cb3e574dea2d1052e39280babc910dc8 "" + "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecbx1095.tfm" 1775415801 3584 21b378cca2e40816b0e6d74a4dc98f04 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecbx1200.tfm" 1775415801 3584 402da0b29eafbad07963b1224b222f18 "" + "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1095.tfm" 1775415801 3584 929cdff2b7a8c11bd4d49fd68cb0ae70 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1200.tfm" 1775415801 3584 f80ddd985bd00e29e9a6047ebd9d4781 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1728.tfm" 1775415801 3584 3c76ccb63eda935a68ba65ba9da29f1a "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecss1200.tfm" 1775415801 3584 db562fb1d1c474cc55f0ce8a1dd94fe7 "" @@ -12,6 +15,8 @@ "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecsx1728.tfm" 1775415801 3584 a5b048a4e362640a1d2d34e624589d34 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecsx2488.tfm" 1775415801 3584 8530f700a3778253a0a6d6639fda16c7 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ectt1200.tfm" 1775415801 1536 487c9b46984a816c7ed238d0674595c7 "" + "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/tcrm1200.tfm" 1775415801 1536 74b7293ec3713bb7fdca8dd1bd1f469c "" + "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm" 1775415801 1528 abec98dbc43e172678c11b3b9031252a "" "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi12.tfm" 1775415801 1524 4414a8315f39513458b80dfc63bff03a "" "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi6.tfm" 1775415801 1512 f21f83efb36853c0b70002322c1ab3ad "" "/usr/share/texmf-dist/fonts/tfm/public/cm/cmmi8.tfm" 1775415801 1520 eccf95517727cb11801f4f1aee3a21b4 "" @@ -23,7 +28,9 @@ "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm" 1775415801 1124 6c73e740cf17375f03eec0ee63599741 "" "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy6.tfm" 1775415801 1116 933a60c408fc0a863a92debe84b2d294 "" "/usr/share/texmf-dist/fonts/tfm/public/cm/cmsy8.tfm" 1775415801 1120 8b7d695260f3cff42e636090a8002094 "" + "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfbx1095.pfb" 1775415801 154600 ea54091d31de803b613ba9e80ca51709 "" "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfbx1200.pfb" 1775415801 140176 d4962f948b4cc0adf4d3dde77a128c95 "" + "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1095.pfb" 1775415801 145929 f25e56369a345c4ff583b067cd87ce8e "" "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1200.pfb" 1775415801 136101 f533469f523533d38317ab5729d00c8a "" "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1728.pfb" 1775415801 131438 3aa300b3e40e5c8ba7b4e5c6cebc5dd6 "" "/usr/share/texmf-dist/fonts/type1/public/cm-super/sfsx1200.pfb" 1775415801 148436 6a185415b8a1b77c58fee2272f3574e2 "" @@ -160,11 +167,11 @@ "/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty" 1775415801 55384 b454dec21c2d9f45ec0b793f0995b992 "" "/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1775415801 5006 d7e899bb5d9717c7f214e9bc0284de7b "" "/usr/share/texmf-dist/web2c/texmf.cnf" 1775415801 43569 fd570f2fa160877d211e859f687312ba "" - "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1777228096 5385779 47c0c393a77fd4a098bacfd57d66b88a "" - "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1778762763 3734533 c370cc050c4a9823a1fe1ab265afc57b "" - "Ringstats_Dokumentation.aux" 1780313072.58542 8525 dc2f45dff6b0575fd760f48e262e0d7d "pdflatex" - "Ringstats_Dokumentation.tex" 1780313071.55337 16584 03bd9bb6b9242fada2b5fd161766d7ed "" - "Ringstats_Dokumentation.toc" 1780313072.58642 1305 1401ae3dd1fbee665ef3e10a49daf4b1 "pdflatex" + "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1780436122 5385779 47c0c393a77fd4a098bacfd57d66b88a "" + "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1780436120 3734532 282dcc45f1c728134b92f993ed6db952 "" + "Ringstats_Dokumentation.aux" 1783431679.08329 11920 6f4c4930e4f31ec828a5b3aab7f8ac7d "pdflatex" + "Ringstats_Dokumentation.tex" 1783431677.99026 22127 9c02fde45b05485b4d6e44f2a7e8ba1e "" + "Ringstats_Dokumentation.toc" 1783431679.08529 2164 0e5aae9731a2850f18801d399dcfe537 "pdflatex" "assets/er-modell.png" 1778764597.46144 805989 0b7323ca4b38e6518c24fd9e5684655b "" (generated) "Ringstats_Dokumentation.aux" diff --git a/Ringstats_Dokumentation.fls b/Ringstats_Dokumentation.fls index 6f0bcfcb..d5e1c5ad 100644 --- a/Ringstats_Dokumentation.fls +++ b/Ringstats_Dokumentation.fls @@ -276,8 +276,17 @@ INPUT ./assets/er-modell.png INPUT ./assets/er-modell.png INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecbx1200.tfm INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/ectt1200.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecrm1095.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmmi10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmsy10.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecbx1095.tfm +INPUT /usr/share/texmf-dist/fonts/tfm/jknappen/ec/tcrm1200.tfm +INPUT /usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc INPUT Ringstats_Dokumentation.aux +INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfbx1095.pfb INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfbx1200.pfb +INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1095.pfb INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1200.pfb INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfrm1728.pfb INPUT /usr/share/texmf-dist/fonts/type1/public/cm-super/sfsx1200.pfb diff --git a/Ringstats_Dokumentation.log b/Ringstats_Dokumentation.log index f44340d7..b806f4f1 100644 --- a/Ringstats_Dokumentation.log +++ b/Ringstats_Dokumentation.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.5.14) 1 JUN 2026 13:24 +This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.2) 7 JUL 2026 15:41 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -725,7 +725,7 @@ LaTeX Font Info: External font `cmex10' loaded for size {/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts /enc/dvips/cm-super/cm-super-t1.enc}] [2] - + File: assets/er-modell.png Graphic file (type png) Package pdftex.def Info: assets/er-modell.png used on input line 87. @@ -740,44 +740,37 @@ Overfull \hbox (9.63942pt too wide) in paragraph at lines 296--308 [][] [] -[7] -Package hyperref Info: bookmark level for unknown todo defaults to 0 on input l -ine 326. - -Overfull \hbox (11.24713pt too wide) in paragraph at lines 326--326 -[] - [] - - -Overfull \hbox (11.24713pt too wide) in paragraph at lines 331--331 -[] - [] - -[8] [9] (./Ringstats_Dokumentation.aux) +[7] [8] [9] [10] +LaTeX Font Info: External font `cmex10' loaded for size +(Font) <10.95> on input line 429. + [11] [12{/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-ts1.enc}] (./ +Ringstats_Dokumentation.aux) *********** LaTeX2e <2025-11-01> L3 programming layer <2026-01-19> *********** ) Here is how much of TeX's memory you used: - 24546 strings out of 469462 - 479912 string characters out of 5468614 - 1009471 words of memory out of 5000000 - 52828 multiletter control sequences out of 15000+600000 - 638939 words of font info for 63 fonts, out of 8000000 for 9000 + 24519 strings out of 469462 + 478765 string characters out of 5468615 + 1015471 words of memory out of 5000000 + 52785 multiletter control sequences out of 15000+600000 + 641744 words of font info for 69 fonts, out of 8000000 for 9000 14 hyphenation exceptions out of 8191 - 108i,8n,108p,11313b,869s stack positions out of 10000i,1000n,20000p,200000b,200000s - -Output written on Ringstats_Dokumentation.pdf (9 pages, 608048 bytes). + 108i,8n,108p,11313b,463s stack positions out of 10000i,1000n,20000p,200000b,200000s + +Output written on Ringstats_Dokumentation.pdf (12 pages, 668797 bytes). PDF statistics: - 172 PDF objects out of 1000 (max. 8388607) - 141 compressed objects within 2 object streams - 29 named destinations out of 1000 (max. 500000) - 122 words of extra memory for PDF output out of 10000 (max. 10000000) + 252 PDF objects out of 1000 (max. 8388607) + 212 compressed objects within 3 object streams + 41 named destinations out of 1000 (max. 500000) + 202 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/Ringstats_Dokumentation.pdf b/Ringstats_Dokumentation.pdf index 1b8c0b32..58b165e7 100644 Binary files a/Ringstats_Dokumentation.pdf and b/Ringstats_Dokumentation.pdf differ diff --git a/Ringstats_Dokumentation.synctex.gz b/Ringstats_Dokumentation.synctex.gz index b0db8898..468e4b9a 100644 Binary files a/Ringstats_Dokumentation.synctex.gz and b/Ringstats_Dokumentation.synctex.gz differ diff --git a/Ringstats_Dokumentation.tex b/Ringstats_Dokumentation.tex index 6d52232a..044416d7 100644 --- a/Ringstats_Dokumentation.tex +++ b/Ringstats_Dokumentation.tex @@ -337,7 +337,7 @@ Für dieses einfache Schreiben und Lesen bringt der Graph mehr Aufwand mit, als % \section{Bau der app bis zur Endpräsi} \newpage -\section{Fazit} +\subsection{Fazit} % Mehr coole sachen die wir gelernt haben. % Warum wir uns fuer dieses Datenbankmodell entschieden haben. Wir haben die gleichen Daten aus unserem ER-Modell in drei Datenbanken abgebildet und dabei gesehen, @@ -363,4 +363,113 @@ Genau dafür ist Redis gemacht. Die komplexen Abfragen, bei denen MongoDB oder Neo4j stark wären, brauchen wir kaum, und unsere Daten sind ohnehin nicht tief verschachtelt. Deshalb passt die schnelle und einfache Lösung am besten zu dem, was Ringstats braucht. + +\newpage +\section{Marktrecherche} +In der Zwischenpräsentation haben wir uns für das Key-Value-Modell entschieden. +In diesem Kapitel schauen wir uns den Markt für Key-Value-Datenbanken genauer an. +Wir stellen sechs Kandidaten vor, darunter ArangoDB eine multimodale Datenbank, +und führen anschließend eine Nutzwertanalyse durch. + +\subsection{Betrachtete Datenbanken} + +\subsubsection{Redis} +Redis ist ein In-Memory Key-Value Store und unsere Wahl aus der Zwischenpräsentation. +Alle Daten liegen im Arbeitsspeicher, wodurch Lese- und Schreibzugriffe im Bereich +von Mikrosekunden liegen. Neben einfachen Strings bringt Redis Datentypen wie +Hashes und Sets mit, auf denen unser Schlüsselaufbau aus +Kapitel~2.2 direkt aufsetzt. Seit Version 8 steht Redis wieder unter einer Open-Source-Lizenz (AGPLv3) +und kostet uns damit nichts. + +\subsubsection{Memcached} +Memcached ist eine verteilte In-Memory-Cache Datenbank und in Sachen +Geschwindigkeit vergleichbar mit Redis. Dafür ist der Funktionsumfang bewusst +klein gehalten: Es gibt nur einfache Key-Value-Paare, keine Datentypen wie Sets +oder Hashes, und keine Persistenz. Unser Schlüsselaufbau mit +SETs für Ausrüstung und Regionen lässt sich also nicht direkt abbilden +Memcached steht unter der BSD-Lizenz. + +\subsubsection{ArangoDB (multimodal)} +ArangoDB ist eine multimodale Datenbank und vereint Dokumente, Graphen und +Key-Value-Zugriffe in einem System mit der gemeinsamen Abfragesprache AQL. +Damit hätten wir unsere drei Modellierungen aus Kapitel~2 theoretisch in einer +einzigen Datenbank abbilden können. Der Nachteil ist der Langsame zugriff auf die Daten. +Seit Version 3.12 steht ArangoDB unter der Business Source +License. Für unser Uni-Projekt ist das kostenlos, für einen +kommerziellen Betrieb gäbe es Einschränkungen. + +\subsubsection{Amazon DynamoDB} +DynamoDB ist der verwaltete Key-Value- und Dokument-Store von AWS. Die Datenbank +skaliert beliebig. Der große Haken ist das Preismodell: +DynamoDB läuft nur in der AWS-Cloud und wird pro Anfrage und Speicher +abgerechnet. Bei unseren dauerhaften Schreibzugriffen von bis zu 10 Anfragen +pro Sekunde würden laufende Kosten entstehen, womit unser +Muss-Kriterium \glqq keine Lizenzkosten\grqq{} verletzt ist. Zudem ist die +Latenz deutlich höher durch den Netzwerkweg in die Cloud. + +\subsubsection{etcd} +etcd ist ein Key-Value Store, der hauptsächlich zum Speichern von +Einstellungen und Konfigurationen benutzt wird, zum Beispiel intern von +Kubernetes, ist also nicht dafür gedacht, laufend Spielerdaten zu speichern wie bei uns. +Die Lizenz ist Apache~2.0 und damit kostenlos. + +\subsubsection{Riak KV} +Riak KV ist ein verteilter Key-Value Store. +Seine Stärke liegt in der Ausfallsicherheit: Daten werden +automatisch über mehrere Knoten repliziert, und der Cluster bleibt auch beim +Ausfall einzelner Knoten verfügbar. Riak KV steht unter der Apache-2.0-Lizenz. + +\subsection{Nutzwertanalyse} +Wir bewerten alle sechs Datenbanken mit den Auswahlkriterien und Gewichten. Jedes Kriterium wird pro Datenbank mit 0 bis 2 Punkten +bewertet und mit dem Gewicht multipliziert. + +\begin{table}[h] +\centering +\small +\begin{tabular}{l c c c c c c c} +\hline +\textbf{Kriterium (Gewicht)} & & \textbf{Redis} & \textbf{Memc.} & \textbf{Arango} & \textbf{Dynamo} & \textbf{etcd} & \textbf{Riak} \\ \hline +Hohe Performanz & (5) & 2 & 2 & 1 & 1 & 1 & 1 \\ +Daten-Streaming & (3) & 2 & 0 & 0 & 2 & 1 & 0 \\ +Niedrige Latenz & (3) & 2 & 2 & 1 & 1 & 1 & 1 \\ +Skalierbarkeit & (1) & 1 & 1 & 1 & 2 & 0 & 2 \\ +Keine Lizenzkosten & (5) & 2 & 2 & 2 & 0 & 2 & 2 \\ +Indexing & (2) & 1 & 0 & 1 & 1 & 0 & 1 \\ +Vektorrechnungen & (1) & 1 & 0 & 1 & 0 & 0 & 0 \\ +Präferenz & (1) & 1 & 0 & 0 & 0 & 0 & 0 \\ \hline +\textbf{Gewichtete Summe} & & \textbf{37} & \textbf{27} & \textbf{22} & \textbf{18} & \textbf{21} & \textbf{22} \\ +\hline +\end{tabular} +\caption{Nutzwertanalyse der sechs Key-Value-Datenbanken} +\label{tab:nutzwertanalyse} +\end{table} + +Redis liegtklar vorne, weil es als einziger Kandidat sowohl bei +Performanz und Latenz als auch beim Daten-Streaming die volle Punktzahl erreicht. +Memcached kommt bei der reinen Geschwindigkeit zwar mit, scheitert aber am +Muss-Kriterium Daten-Streaming. DynamoDB fällt aber wegen der laufenden Kosten am Muss-Kriterium \glqq keine Lizenzkosten\grqq{} durch. +ArangoDB ist als multimodale +Datenbank flexibel, aber nicht auf unser schreiblastiges Live-Szenario +zugeschnitten, etcd ist für Konfigurationsdaten statt Anwendungsdaten gebaut, +und bei Riak KV kommt zur fehlenden Streaming-Funktion die kaum noch aktive +Entwicklung hinzu. + +\subsection{Datenbankauswahl} +Aus den sechs betrachteten Datenbanken wählen wir drei aus, die wir umsetzen +und miteinander vergleichen, jeweils eine pro Gruppenmitglied: + +\begin{itemize} + \item \textbf{Redis} (Justin Rost) --- der Sieger unserer Nutzwertanalyse + und unsere Wahl aus der Zwischenpräsentation, bisher aber noch nicht + umgesetzt. Redis dient im Vergleich als Referenz, an der sich die beiden + anderen Datenbanken messen müssen. + \item \textbf{Memcached} (Yasin Ergün) --- der direkteste Konkurrent, da + ebenfalls In-Memory und ähnlich schnell. Der Vergleich zeigt, welche + Redis-Funktionen wir tatsächlich brauchen und was uns bei einem reinen + Cache fehlen würde. + \item \textbf{ArangoDB} (Michelle Reichelt) --- die multimodale Datenbank + im Feld. Der Vergleich zeigt, was uns eine einzige Datenbank für alle drei + Modellierungen aus Kapitel~2 gebracht hätte und was sie an Performanz kostet. +\end{itemize} + \end{document} diff --git a/Ringstats_Dokumentation.toc b/Ringstats_Dokumentation.toc index 752f5532..b95c94b5 100644 --- a/Ringstats_Dokumentation.toc +++ b/Ringstats_Dokumentation.toc @@ -11,5 +11,15 @@ \contentsline {subsection}{\numberline {3.1}Vor- und Nachteile des Key-Value-Modells}{8}{subsection.3.1}% \contentsline {subsection}{\numberline {3.2}Vor- und Nachteile des dokumentenorientierten Modells}{8}{subsection.3.2}% \contentsline {subsection}{\numberline {3.3}Vor- und Nachteile des Graph-Modells}{8}{subsection.3.3}% -\contentsline {section}{\numberline {4}Fazit}{9}{section.4}% +\contentsline {subsection}{\numberline {3.4}Fazit}{9}{subsection.3.4}% +\contentsline {section}{\numberline {4}Marktrecherche}{10}{section.4}% +\contentsline {subsection}{\numberline {4.1}Betrachtete Datenbanken}{10}{subsection.4.1}% +\contentsline {subsubsection}{\numberline {4.1.1}Redis}{10}{subsubsection.4.1.1}% +\contentsline {subsubsection}{\numberline {4.1.2}Memcached}{10}{subsubsection.4.1.2}% +\contentsline {subsubsection}{\numberline {4.1.3}ArangoDB (multimodal)}{10}{subsubsection.4.1.3}% +\contentsline {subsubsection}{\numberline {4.1.4}Amazon DynamoDB}{11}{subsubsection.4.1.4}% +\contentsline {subsubsection}{\numberline {4.1.5}etcd}{11}{subsubsection.4.1.5}% +\contentsline {subsubsection}{\numberline {4.1.6}Riak KV}{11}{subsubsection.4.1.6}% +\contentsline {subsection}{\numberline {4.2}Nutzwertanalyse}{11}{subsection.4.2}% +\contentsline {subsection}{\numberline {4.3}Datenbankauswahl}{12}{subsection.4.3}% \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/build/Ringstats_Dokumentation.aux b/build/Ringstats_Dokumentation.aux index ff88a506..4ef8e144 100644 --- a/build/Ringstats_Dokumentation.aux +++ b/build/Ringstats_Dokumentation.aux @@ -39,7 +39,9 @@ \@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Vor- und Nachteile des Graph-Modells}{8}{subsection.3.3}\protected@file@percent } \BKM@entry{id=13,dest={73656374696F6E2E34},srcline={340}}{5C3337365C3337375C303030465C303030615C3030307A5C303030695C30303074} \@writefile{toc}{\contentsline {section}{\numberline {4}Fazit}{9}{section.4}\protected@file@percent } +\BKM@entry{id=14,dest={73656374696F6E2E35},srcline={368}}{5C3337365C3337375C3030304D5C303030615C303030725C3030306B5C303030745C303030725C303030655C303030635C303030685C303030655C303030725C303030635C303030685C30303065} +\@writefile{toc}{\contentsline {section}{\numberline {5}Marktrecherche}{10}{section.5}\protected@file@percent } \global\@namedef{scr@dte@section@lastmaxnumwidth}{12.14694pt} \global\@namedef{scr@dte@subsection@lastmaxnumwidth}{19.70898pt} \@writefile{toc}{\providecommand\tocbasic@end@toc@file{}\tocbasic@end@toc@file} -\gdef \@abspage@last{9} +\gdef \@abspage@last{10} diff --git a/build/Ringstats_Dokumentation.fdb_latexmk b/build/Ringstats_Dokumentation.fdb_latexmk index 9ae3462d..358b6a55 100644 --- a/build/Ringstats_Dokumentation.fdb_latexmk +++ b/build/Ringstats_Dokumentation.fdb_latexmk @@ -1,5 +1,5 @@ # Fdb version 4 -["pdflatex"] 1780687793.04109 "Ringstats_Dokumentation.tex" "build/Ringstats_Dokumentation.pdf" "Ringstats_Dokumentation" 1780687794.00438 0 +["pdflatex"] 1783429170.25382 "Ringstats_Dokumentation.tex" "build/Ringstats_Dokumentation.pdf" "Ringstats_Dokumentation" 1783429171.46916 0 "/usr/share/texmf-dist/fonts/enc/dvips/cm-super/cm-super-t1.enc" 1775415801 2971 def0b6c1f0b107b3b936def894055589 "" "/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1775415801 3524 cb3e574dea2d1052e39280babc910dc8 "" "/usr/share/texmf-dist/fonts/tfm/jknappen/ec/ecbx1200.tfm" 1775415801 3584 402da0b29eafbad07963b1224b222f18 "" @@ -161,10 +161,10 @@ "/usr/share/texmf-dist/web2c/texmf.cnf" 1775415801 43569 fd570f2fa160877d211e859f687312ba "" "/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1780436122 5385779 47c0c393a77fd4a098bacfd57d66b88a "" "/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1780436120 3734532 282dcc45f1c728134b92f993ed6db952 "" - "Ringstats_Dokumentation.tex" 1780687790.47947 16588 b04ea6d6404d252977bf34dce650e1c0 "" + "Ringstats_Dokumentation.tex" 1783429156.65473 16624 26aaf733867a9bf977b13d601b9ee80c "" "assets/er-modell.png" 1778764597.46144 805989 0b7323ca4b38e6518c24fd9e5684655b "" - "build/Ringstats_Dokumentation.aux" 1780687793.96743 8079 e14d3fbb21e9c686a9967800d978e8e7 "pdflatex" - "build/Ringstats_Dokumentation.toc" 1780687793.96843 1305 1401ae3dd1fbee665ef3e10a49daf4b1 "pdflatex" + "build/Ringstats_Dokumentation.aux" 1783429171.42113 8408 fc30f1f377b4ce8b0a4e3079c56db12c "pdflatex" + "build/Ringstats_Dokumentation.toc" 1783429171.42313 1376 618376327eb7843bc7a20a1d978c49f9 "pdflatex" (generated) "build/Ringstats_Dokumentation.aux" "build/Ringstats_Dokumentation.log" diff --git a/build/Ringstats_Dokumentation.log b/build/Ringstats_Dokumentation.log index 7990a5bf..dec98c2d 100644 --- a/build/Ringstats_Dokumentation.log +++ b/build/Ringstats_Dokumentation.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.2) 5 JUN 2026 21:29 +This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.6.2) 7 JUL 2026 14:59 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -722,7 +722,7 @@ LaTeX Font Info: External font `cmex10' loaded for size {/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}{/usr/share/texmf-dist/fonts /enc/dvips/cm-super/cm-super-t1.enc}] [2] - + File: assets/er-modell.png Graphic file (type png) Package pdftex.def Info: assets/er-modell.png used on input line 87. @@ -737,17 +737,17 @@ Overfull \hbox (9.63942pt too wide) in paragraph at lines 296--308 [][] [] -[7] [8] [9] (build/Ringstats_Dokumentation.aux) +[7] [8] [9] [10] (build/Ringstats_Dokumentation.aux) *********** LaTeX2e <2025-11-01> L3 programming layer <2026-01-19> *********** ) Here is how much of TeX's memory you used: - 24473 strings out of 469462 - 477938 string characters out of 5468615 - 1009471 words of memory out of 5000000 - 52757 multiletter control sequences out of 15000+600000 + 24476 strings out of 469462 + 477960 string characters out of 5468615 + 1010471 words of memory out of 5000000 + 52758 multiletter control sequences out of 15000+600000 638939 words of font info for 63 fonts, out of 8000000 for 9000 14 hyphenation exceptions out of 8191 108i,8n,108p,11253b,461s stack positions out of 10000i,1000n,20000p,200000b,200000s @@ -758,10 +758,10 @@ m-super/sfsx1200.pfb> -Output written on build/Ringstats_Dokumentation.pdf (9 pages, 607609 bytes). +Output written on build/Ringstats_Dokumentation.pdf (10 pages, 609620 bytes). PDF statistics: - 170 PDF objects out of 1000 (max. 8388607) - 139 compressed objects within 2 object streams - 27 named destinations out of 1000 (max. 500000) - 122 words of extra memory for PDF output out of 10000 (max. 10000000) + 179 PDF objects out of 1000 (max. 8388607) + 147 compressed objects within 2 object streams + 29 named destinations out of 1000 (max. 500000) + 130 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/build/Ringstats_Dokumentation.pdf b/build/Ringstats_Dokumentation.pdf index 01777e67..8099db81 100644 Binary files a/build/Ringstats_Dokumentation.pdf and b/build/Ringstats_Dokumentation.pdf differ diff --git a/build/Ringstats_Dokumentation.toc b/build/Ringstats_Dokumentation.toc index 752f5532..fb485287 100644 --- a/build/Ringstats_Dokumentation.toc +++ b/build/Ringstats_Dokumentation.toc @@ -12,4 +12,5 @@ \contentsline {subsection}{\numberline {3.2}Vor- und Nachteile des dokumentenorientierten Modells}{8}{subsection.3.2}% \contentsline {subsection}{\numberline {3.3}Vor- und Nachteile des Graph-Modells}{8}{subsection.3.3}% \contentsline {section}{\numberline {4}Fazit}{9}{section.4}% +\contentsline {section}{\numberline {5}Marktrecherche}{10}{section.5}% \providecommand \tocbasic@end@toc@file {}\tocbasic@end@toc@file diff --git a/endpraesi/bench-all.ts b/endpraesi/bench-all.ts new file mode 100644 index 00000000..a02f4448 --- /dev/null +++ b/endpraesi/bench-all.ts @@ -0,0 +1,48 @@ +const targets = [ + { name: "Redis", dir: "client-redis/client-redit" }, + { name: "Memcached", dir: "client-memcached" }, + { name: "ArangoDB", dir: "client-arangodb" }, +]; + +const results: any[] = []; + +for (const t of targets) { + console.log(`\n>>> Running benchmark for ${t.name} ...`); + const proc = Bun.spawnSync(["bun", "bench.ts"], { cwd: t.dir, stdout: "pipe", stderr: "pipe" }); + const out = proc.stdout.toString(); + const err = proc.stderr.toString(); + process.stdout.write(out.split("\n").filter(l => !l.startsWith("##RESULT##")).join("\n")); + if (err.trim()) process.stderr.write(err); + const line = out.split("\n").find(l => l.startsWith("##RESULT## ")); + if (line) results.push(JSON.parse(line.slice("##RESULT## ".length))); +} + +function pad(s: string, n: number) { + return s.padEnd(n); +} +function padNum(s: string, n: number) { + return s.padStart(n); +} + +const testMeta = [ + { idx: 0, title: "Anwendungsfall 1 - Schreiben (Live-Player-Sync, 1 Schluessel)" }, + { idx: 1, title: "Anwendungsfall 1 - Lesen (Live-Player-Sync, 1 Schluessel)" }, + { idx: 2, title: "Anwendungsfall 2 - Lesen (Region / Fast Travel, 14 Schluessel)" }, + { idx: 3, title: "Anwendungsfall 2 - Schreiben (Region / Fast Travel, 14 Schluessel)" }, +]; + +console.log("\n\n==================== VERGLEICH ===================="); + +for (const m of testMeta) { + console.log(`\n${m.title}`); + console.log(` ${pad("DB", 12)} | ${padNum("Ops/s", 11)} | ${padNum("ms/Op", 10)} | ${padNum("Gesamt ms", 11)}`); + console.log(` ${"-".repeat(12)}-+-${"-".repeat(11)}-+-${"-".repeat(10)}-+-${"-".repeat(11)}`); + const rows = results.map(r => ({ db: r.db, t: r.tests[m.idx] })); + const fastest = Math.max(...rows.map(x => x.t.opsPerSec)); + for (const row of rows) { + const mark = row.t.opsPerSec === fastest ? " <-- am schnellsten" : ""; + console.log(` ${pad(row.db, 12)} | ${padNum(Math.round(row.t.opsPerSec).toString(), 11)} | ${padNum(row.t.avgMs.toFixed(4), 10)} | ${padNum(row.t.ms.toFixed(1), 11)}${mark}`); + } +} + +console.log("\n=================================================="); diff --git a/endpraesi/demo/client-redit/.gitignore b/endpraesi/client-arangodb/.gitignore similarity index 100% rename from endpraesi/demo/client-redit/.gitignore rename to endpraesi/client-arangodb/.gitignore diff --git a/endpraesi/client-arangodb/CLAUDE.md b/endpraesi/client-arangodb/CLAUDE.md new file mode 100644 index 00000000..348e29e5 --- /dev/null +++ b/endpraesi/client-arangodb/CLAUDE.md @@ -0,0 +1,35 @@ + +Default to using Bun instead of Node.js. + +- Use `bun ` instead of `node ` or `ts-node ` +- Use `bun test` instead of `jest` or `vitest` +- Use `bun build ` instead of `webpack` or `esbuild` +- Use `bun install` instead of `npm install` or `yarn install` or `pnpm install` +- Use `bun run