Aloha,
ich habe schon zwei Themen hier im Forum entdeckt, die sich um das Thema drehen, allerdings beantwortet keiner davon die Fragen, die sich mir im Laufe meiner Entwicklungsarbeit aufgetan haben zufriedenstellend und ich denke, die Fragen stellen sich nicht nur mir.
Okay, kommen wir mal zum ersten Punkt, bei dem sich meine Sorgen hauptsächlich um die Performance drehen:
Als Beispiel nehme ich mal eine Spielfigur die eine Waffe tragen kann. Wenn ich mich an alle NF halte, sollte ich mir 3 Tabellen basteln. Eine mit der Figur und eine mit den Eigenschaften der Waffe. Dann eine, die sowohl auf den Spieler und die Waffeneigenschaften verweist und eventuell noch Werte wie Haltbarkeit/Abnutzung enthält.
Wenn ich nun will, dass meine Figur eine andere Figur haut, brauche ich im besten Fall 3 Abfragen (die ich natürlich verknüpfen kann, aber dass lassen wir erstmal außen vor). Ich brauche die Figur an sich, dann die Waffe, die auf den Schlüssel der Figur zeigt (quasi gerade getragen wird) und ich brauche die Werte der Waffe, die in einer anderen Spalte stehen.
Wie sinnvoll wäre es in einem solchen Fall, auf die Normalisierung zu pfeifen und bzw die Schadenswerte der Waffe redundant in der Charaktertabelle zu speichern? Es reicht ja teoretisch vollkommen aus, beim Anlegen oder Ablegen der Waffe, den Schaden den der Charakter macht, in seiner Tabelle zu updaten. Es besteht natürlich die Gefahr, das bei Anpassungen, der Spieler auf einmal weniger oder mehr Schaden macht, als er sollte, aber natürlich kann man dafür fix ne Funktion basteln, die kurz die Relationen zwischen Spielerschaden, Waffe und Waffentyp checkt und Fehler ausbügelt. Den Vorteil sehe ich dann jedoch darin, dass bei bzw großen Kämpfen wo mehrere Charaktere Kämpfen, nicht bei jedem Schlag 3 Tabellen abgefragt werden müssen, sondern nur 1 pro Charakter, und das nur am Anfang des Kampfes. Man könnte so im besten Fall 2/3 der Querys einsparen.
Hat das einen Sinn? Übersehe ich was? Hat jemand Erfahrung damit, ob diese Einsparung was bringt oder letztlich in der Auslastung des Servers kaum eine Rolle spielt?
Nächste Frage zu dem Thema: Angenommen ich habe in meinem Spiel eine beliebige Anzahl an Ressourcen. BZW wenn ich nur welche für den Handel benötige ... (also für den Spieler Sinnlosen Rohstoff bei A kaufen und mit Profit bei B verkaufen).
Nun habe ich mir im groben 2 Systeme überlegt, wie man damit am besten verfahren könnte:
1.) Wäre eine der NF ensprechende: Es gibt 2 Tabellen für Rohstoffe. Einmal den Rohstofftyp mit Infos wie Name, Standartpreis, Gewicht etc und eine Tabelle mit "Rostoffpaketen". Also eine verlinkung auf einen Rohstofftyp, eine auf einen Spieler und ein Eintrag für die Menge. Bei Abfragen nach Rohstoffen werden nun halt nach Spalten mit der richtigen Spielerid und Rohstofftyp gesucht und es wird die Menge gecheckt.
2.) Möglichkeit: Ich spare mir die Pakettabelle und benutze in der Tabelle des Spielers einen formatierten String, der Infos zu den Rohstoffen im besitzt enthält:
Beispiel: 1:50;3:23;8:2
Bedeutet: Spieler hat vom Rohstofftyp 1. 50 Einheiten, vom 3. 23 und vom 8 genau 2. Den Rohstofftyp könnte man hier der Einfachhalt halber direkt als Namen nehmen oder aber auch als Schlüssel für die Oben vorgestellte Rohstofftypentabelle. Mit explode() würde sich so ein String wunderbar zerlegen und bearbeiten lassen. Hier könnte man wieder Querys sparen, jedoch weiß ich nicht genau wie es mit der Performance von explode und implode bei PHP (oder anderen Sprachen) aussieht. Allerdings könnte man auch so last von der Datenbank auf den CPU verlagern, soltle dieser sich zu sehr langweilen^^.
Grundfrage ist bei beiden halt: In wie weit lohnt sich diese Verringerung der Querys? Spielt es in diesem kleinen Bereich überhaupt eine Rolle, ob ich normalisiere oder nicht?
So, genug zu meinen Fragen und Überlegungen. Ich denke für das meiste gibt es eh 100 mal bessere Lösungen.