Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

NyNooNyrox

Frischling

  • »NyNooNyrox« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Gänserndorf

Beruf: Mechatroniker

  • Private Nachricht senden

1

22.09.2017, 10:44

MySQL Datenbank Aufteilung

Hallo,

eine kurze Vorgeschichte:

Ich programmiere seit 6 Jahren. Etwa 1 Jahr nun an einem 2D MMO Spiel. Das ganze wird in C# mit dem Framework XNA programmiert. Als Anbieter für unseren Server nutze ich momentan einen virtuellen Windows Server von World4You. Als Datenbank nutze ich XAMPP mit der MySQL Datenbank.

Mein Problem:

Bisher hat alles sehr gut funktioniert. Da ich jedoch langsam meinen Code verbessern anstelle erweitern muss fallen mir einige Dinge auf welche ich ändern möchte. Mein größtes Problem liegt an der Datenbank. Sämtliche Informationen werden im Moment in einem einzigen Table gespeichert. Zusätzliche lese ich immer einen gesamten Table-Eintrag aus.

Nennen wir den Table "PlayerData" welcher die Values "ID (int), EntityID (int), Username (string), Password (string), Email (string), ModelIndex (short), PlayerRank (short), WorldPosition X (int), WorldPosition Y (int)" beinhaltet.

Da die Datenbank langsam erweitert werden muss möchte ich die ganze Architektur ändern. Es sollen werde wie "Geld (int), Geschlecht (short), LastLogin (DateTime), ..." implementiert werden. Alles in einem Table zu stopfen wäre daher sehr kontraproduktiv.

Für mich stellt sich nun die Frage wie Datenbanken allgemein bei MMO's aufgeteilt werden. Es wird eine Freundesliste geben, InventarSlots, Quests, ... Ich habe diesbezüglich keine Vorstellungskraft dies passend umzusetzen.

Habt ihr vielleicht Links bzw. Vorschläge für mich?

Vielen lieben Dank!

Meine Aussagen mögen Sarkasmus und andere nicht wirklich ernst zunehmende Dinge beinhalten.
Aus diesem Grund übernehme ich keine Haftung wenn der Elefant aus der Kühltruhe fliegt.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

22.09.2017, 10:52

Es spricht aus meiner Sicht nichts dagegen, "statische" Spielerattribute wie ID, Username, Password (hoffentlich gehasht und nicht im Klartext!!!), ..., Geschlecht, LastLogin usw. gemeinsam in einer einzigen Tabelle zu speichern. Die gehören halt alle zu einem Spieler dazu, sind durch einfache Typen darstellbar und jeder Spieler hat genau eins davon.
Ob es sich lohnt, stark dynamische Attribute wie Position, Geld, Erfahrungspunkte etc. in separate Tabellen auszulagern, weiß ich nicht. Das müsste man mal ausprobieren.
Für Dinge wie Inventar oder Freundeslisten brauchst du aber definitiv zusätzliche Tabellen. Für eine Freundesliste würdest du eine Freunde-Tabelle anlegen, wobei jeder Eintrag aus zwei User-IDs besteht. Jeder Eintrag beschreibt also die Freundschaft zwischen zwei Spielern. Ein Eintrag (1, 7) würde beispielsweise bedeuten, dass die Spieler mit den IDs 1 und 7 miteinander befreundet sind. Siehe: https://dba.stackexchange.com/questions/…-for-friendship

PS: Ein richtiges MMO-Spiel würde wahrscheinlich kein MySQL benutzen, sondern etwas anderes, das sich besser auf sehr viele Server verteilen lässt. Aber solange du nicht erwartest, dass dein Spiel ein Riesen-Hit wird, solltest du dir darüber keine Gedanken machen ... ;)

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

22.09.2017, 11:11

Ggf hilft ja das Stichwort "normalisierung datenbank" weiter. Über Performance würde ich mir keine Sorgen machen. Sollte es mal eng werden, kann oft durch Optimierung der Anfragen, viel gewonnen werden.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

22.09.2017, 11:28

Für eine Freundesliste würdest du eine Freunde-Tabelle anlegen, wobei jeder Eintrag aus zwei User-IDs besteht. Jeder Eintrag beschreibt also die Freundschaft zwischen zwei Spielern. Ein Eintrag (1, 7) würde beispielsweise bedeuten, dass die Spieler mit den IDs 1 und 7 miteinander befreundet sind.

Solange Freundschaft symmetrisch ist passt das. Kann es jedoch sein dass Spieler A Spieler B auf der Freundesliste hat, Spieler B aber nicht Spieler A auf der Liste haben muss, so müsste das System zumindest anders interpretiert werden. Ein Eintrag (1, 7) könnte dann bedeuten dass Spieler 1 mit Spieler 7 befreundet ist. Haben sich beide Spieler gegenseitig auf der Liste so würde ein ein zweiter Eintrag (7, 1) benötigt. Das wäre zumindest eine Umsetzung. Aber das hängt davon ab wie man Freundschaft umsetzen möchte.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

22.09.2017, 11:37

@Schorsch: Ja, das ist auch in der verlinkten Diskussion beschrieben :)

NyNooNyrox

Frischling

  • »NyNooNyrox« ist der Autor dieses Themas

Beiträge: 38

Wohnort: Gänserndorf

Beruf: Mechatroniker

  • Private Nachricht senden

6

22.09.2017, 13:22

Hallo,

die Freundesliste basiert dann auf gegenseitige Freundschaft, sprich wenn Spieler A mit Spieler B befreundet ist, ist Spieler B automatisch mit Spieler A befreundet. Das ganze passiert über eine Anfrage an den Spieler ("Spieler A möchte mit dir befreundet sein. Annehmen // Ablehnen)

Ich habe das ganze nun etwas geändert. Credentials, Information und Position. Credentials beinhaltet die ID, den Usernamen, das Passwort und die Email. Position logischerweise die Position auf der Karte des Charakters und Information alle bezogenen Daten wie Geld, Spielerrank, Geschlecht etc.

Für weitere Tipps & Tricks stehe ich gerne offen.

Vielen Dank.

Meine Aussagen mögen Sarkasmus und andere nicht wirklich ernst zunehmende Dinge beinhalten.
Aus diesem Grund übernehme ich keine Haftung wenn der Elefant aus der Kühltruhe fliegt.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

22.09.2017, 14:47

Noch als Tipp: es hilft sich vorher ein Modell anzulegen. Am besten als ER Diagramm: https://www.lucidchart.com/pages/de/was-…onship-diagramm als Tool kann ich StarUML empfehlen (kostenlos ewig evaluieren).

8

26.09.2017, 01:07

Willst du wirklich ein MMO entwickeln?
Weil dafür wäre eine relationale Datenbank wie MySQL wohl eher Fehl am Platz, da sind NoSQL Datenbanken besser geeignet und schneller.
Ich kenne keine MMO Firma, die MySQL als Datenbank verwendet, dein Datenbank Server würde viel zu schnell in die Knie gehen.
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

26.09.2017, 09:46

Je nach Struktur etc kann eine SQL Datenbank schon mehrere tausend Anfragen pro Sekunde bearbeiten (Referenz: https://serverfault.com/questions/164980…ysql-server-run ). Somit stellt sich die Frage, ob sich in der Anfangszeit der Aufwand wirklich lohnt wirklich MMO bereit zu sein. Oder ob man nicht erstmal seine Energie darin investiert ein funktionierendes Spiel auf die Beine zu stellen. Je nach Spieltyp kann ein einzelner Server immerhin mehrere hundert Spieler bespaßen. Auf diese Anzahl muss man erstmal kommen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige