Datenstrukturen organisieren

Hallo,

ich schreibe ein MMORPG (Massive Multiplayer Onlinerollenspiel) in PHP und mySQL. Dabei erschafft man sich einen virtuellen Charakter und tritt gegen andere online auf der Website an. Das Ganze ist textbasiert, man sieht also keine Kämpfe etc. Das System soll so ähnlich werden wie http://www.everwars.com.

ich plane, z.B. die Waffen in einer Tabelle abzulegen, also etwa so : Id, Name, Schaden, Typ, etc.

Wenn nun ein Character eine Waffe kauft, muß sie ihm zugeordnet logischerweise werden.

Das habe ich mir so vorgestellt:

Tabelle : Character ID, Waffen ID

Wenn ich nun alle Waffen eines Characters wissen möchte, frage ich also nach seiner Character ID und lasse mir per LEFT Join zu jeder Waffe die Werte ausgeben.

Ist das schnell genug oder sollte ich die Daten der Waffen gleich mit in die tabelle schrieben, um das LEFT JOIN einzusparen?
Und welche INDICES setze ich am besten?

Genauso wollte ich das Ganze für die Rüstungen und anderen Ausrüstungsgegenstände machen.

Danke für jegliche Hilfe!

Daniel

Hi Daniel,

ich plane, z.B. die Waffen in einer Tabelle abzulegen, also
etwa so : Id, Name, Schaden, Typ, etc.

Wenn nun ein Character eine Waffe kauft, muß sie ihm
zugeordnet logischerweise werden.

Das habe ich mir so vorgestellt:

Tabelle : Character ID, Waffen ID

Wenn ich nun alle Waffen eines Characters wissen möchte, frage
ich also nach seiner Character ID und lasse mir per LEFT Join
zu jeder Waffe die Werte ausgeben.

Ist das schnell genug oder sollte ich die Daten der Waffen
gleich mit in die tabelle schrieben, um das LEFT JOIN
einzusparen?

wenn es nur 1-10 Kriterien pro Waffe gibt: JA. Solltest Du mehrere und/oder dynamische Werte pro Waffe haben, dann benötigst Du eine seperate Tabelle.

Und welche INDICES setze ich am besten?

Erst mal auf die ID’s in den Tabellen. Dann die Felder, in denen am häufigsten gesucht wird. Aber nicht mehr als 3 pro Tabelle, sonst wird es zu langsam.

Gruß
Wolfgang

Zusatzfrage
Hallo,

danke für Deine Antwort.

wenn es nur 1-10 Kriterien pro Waffe gibt: JA. Solltest Du
mehrere und/oder dynamische Werte pro Waffe haben, dann
benötigst Du eine seperate Tabelle.

Du meinst, wenn meine Waffentabelle mehr als 10 Spalten hätte, wäre es per JOIN performancemäßig besser? Sollte ich dann einen LEFT JOIN nehmen oder einen INNER JOIN? Ein INNER JOIN müßte doch auch gehen, oder nicht?

Da ich nicht nur Waffen so zuweisen möchte, sondern auch Rüstungen/Items benötige ich natürlich ebenfalls Tabellen dafür. Ihre Spalten werden zwar etwas andern, aber das System wäre gleich. Hierfür gilt dann wahrscheinlich auch Deine Aussage oben?

Ein Character kann naürlich mehrere Waffen haben, deren IDs ihm anhand der Waffen ID aus den Waffen Tabelle zugewiesen wird. Es wäre doch eigentlich ok, die Werte einfach in die Zuordnungstabelle zu übertragen, da man dann einen JOIN sparen kann, der in dem Fall unnötig Zeit frisst.

Wann sind Tabellen zu groß zum schnellen Durchsuchen? Wenn z.B 5.000 Charaktere existieren, und jeder 10 Gegenstände besitzt, habe ich schon 50.000 zeilen in der Zuordnungstabelle! Wenn ich dann noch die Spalten für die Waffen integriert hätte, hätte die Tabelle Aussmaße von 10x50.000 Feldern!

Dank im voraus!

Daniel

Du meinst, wenn meine Waffentabelle mehr als 10 Spalten hätte,
wäre es per JOIN performancemäßig besser? Sollte ich dann
einen LEFT JOIN nehmen oder einen INNER JOIN? Ein INNER JOIN
müßte doch auch gehen, oder nicht?

ja klar

Da ich nicht nur Waffen so zuweisen möchte, sondern auch
Rüstungen/Items benötige ich natürlich ebenfalls Tabellen
dafür. Ihre Spalten werden zwar etwas andern, aber das System
wäre gleich. Hierfür gilt dann wahrscheinlich auch Deine
Aussage oben?

ja klar

Ein Character kann naürlich mehrere Waffen haben, deren IDs
ihm anhand der Waffen ID aus den Waffen Tabelle zugewiesen
wird. Es wäre doch eigentlich ok, die Werte einfach in die
Zuordnungstabelle zu übertragen, da man dann einen JOIN sparen
kann, der in dem Fall unnötig Zeit frisst.

jein, kommt auf die Gesamtzahl der Haupttabelle an. Man sollte nicht zu viele Felder haben.

Wann sind Tabellen zu groß zum schnellen Durchsuchen? Wenn z.B
5.000 Charaktere existieren, und jeder 10 Gegenstände besitzt,
habe ich schon 50.000 zeilen in der Zuordnungstabelle! Wenn
ich dann noch die Spalten für die Waffen integriert hätte,
hätte die Tabelle Aussmaße von 10x50.000 Feldern!

Das kann man nicht so pauschal sagen. Der Index ist ja auf dem zu durchsuchenden Feld gesetzt, d.h. gesucht wird erst mal in einem Feld. Vorausgesetz die SQL-Abfrage ist dementsprechend :smile:. Dann kommt es darauf an, wieviele Infos Du dem Abfragenden zur Verfügung stellen willst. Je mehr, desto langsamer…denn die müssen ja alle übertragen werden.
Einige Spiele sind so konzipiert, das Basis-Elemente schon beim Spieler auf dem Pc gespeichert sind, so das diese nicht erst übertragen werden müssen, nur die entsprechende ID.

Gruß Wolfgang

Hallo,

danke noch mal für Deine Hilfe! Ich denke, ich werde alles per JOINs machen, da dadurch die Tabellen sauber bleiben und alle Infos da sind, wo sie hingehören. So habe ich keine doppelten Datensätze für z.B. Waffen, da alles in der Waffentabelle bleibt.

Und da ich eigentlich immer nach IDs suche, und höchstens 10 Spalten und Reihen abfrage, sollte sich der Aufwand für mySQL auch in Grenzen halten.

Daniel

Hmmm,

also ich persönlich würde überhaupt nicht mit einem expliziten JOIN arbeiten, sondern die Abfrage irgendwie so gestalten:

Es gibt drei Tabellen: Person, Waffe, Person_Waffen. Letztere ist die Zuordnungstabelle, die nur die zwei Felder WaffenID und PersonID enthält (beides zusammen als Primärschlüssel). Dann lautet der SQL-Befehl in etwa so:

SELECT Bezeichnung FROM Person_Waffen PW, Waffe W
WHERE PW.WaffenID = W.WaffenID
AND PW.PersonID = 5

Mit dieser Abfrage erhältst Du eine einspaltige Tabelle, die alle Bezeichnungen aller Waffen des Charakters mit der ID 5 ausgibt.

Hallo,

danke für Deie Antwort, so in der Art hatte ich mir das inzwischen auch schon überlegt. Wenn nun zwei Leute dieser Meinung sind, kann’s ja nur gut sein :wink:

Daniel