Größe der Datenbank und schnelligkeit

Hey Leutz,

ich programmiere derzeit ein Browsergame, es wird natürlich nicht auf bplaced laufen, da dies untersagt ist.

Aber ich habe online im Mysql hanbuch gelesen das eine Tabelle nur 1000 Spalten haben darf? stimmt das oder ist das veraltet? … wäre es dabei dann sinnvoll die Eigenschaften von 250 Gegenständen in eine spalte zu packen und später mit substring das rausnehmen was man braucht? Es wäre möglich, da jede Eigenschaft von der länge her immer gleich ist? Da stellt sich mich dann die frage was schneller ist? und Wieviel Speicher es kostet 250 Spalten mit nem int der Länge 32 aufzurufen oder 1000 mit der Länge 8 ?

Es müssten bei der Länge 8 auf jeden Fall ca 200 Spalten auf einmal abgerufen werden

Vielen Dank im voraus

LG Passiy

Eine Tabelle mit 1000 Spalten klingt als wüsstest du nicht wie du deine Datenbank richtig organisieren musst.

Wenn ich das richtig sehe, hast du vor eine ganze Menge Gegenstände einem Datensatz (z.b. einem Spieler) zuzuweisen?
Vernünftigerweise würde man das womöglich mit einer Many-To-Many Beziehung bewerkstelligen.

Als Beispiel: Hat ein Spieler eine reihe Gegenstände, so ist es sinnvoll eine Tabelle für die Spieler zu haben und eine Tabelle für die Gegenstände. Und diese beiden Tabellen verknüpft man dann mit einer dritten Tabelle, die lediglich die Fremdschlüssel zum Spieler und Gegenstand der anderen Tabelle enthält. Zusätzlich kann man noch weiter Attribute in der dritten Tabelle einfügen (z.b. Menge).
Das Auslesen macht man dann mit einem oder mehreren JOINs.

mfg Balmung

Hey Danke für deine Schnelle Antwort =) joa doch aber ich hab scho 7 Tabellen die sind auch alle miteinander verknüpft das Problem ist den Waffen werden zufällige Werte zugeschrieben, das heißt ich brauche zwischen 250-1000 verschiedene Gegenstände die in 5 Kategorien Unterteilt sind und das wären dann min 200 pro Tabelle wenn ich sie schon Unterteile und dann wären bei jeder Tabelle 800-1000 Spalten wegen 4-5 Eigenschaften. Vllt stellt das mein Problem etwas genauer da ^^

Und wie ist das mit der Schnelligkeit kannst du mir dazu was sagen ?

7 Tabellen ist ja noch recht wenig für sowas umfangreiches wie ein Browsergame. Es dürfen ruhig dreimal so viele sein, solange man weiß welche Tabelle was anthalten soll.

Wie du darauf kommst, dass du so viele Spalten brauchst (verwechselt du vielleicht den Begriff und meist Datensätze (Zeilen)?), ist mir schleierhaft.
Wenn man Waffen/Gegenstände in Kategorien aufteilt, würde man in der Regel eine Tabelle für die Kategorien erstellen (auch wenn es nur 5 Datensätze in der Tabelle werden). Und eine Tabelle für alle Gegenstände, in der eine Spalte eine Referenz zur Kategorie ist.
Die Zufallswerte der Waffen kann man, je nach dem wie du dir das überlegt hast, vielleicht auch abkapseln und in eine eigene Tabelle stecken.
Wieviele Datensätze dann in der Tabelle sind, ist egal.

Was mit der Schnelligkeit ist, kann ich nicht beurteilen. Dein vorhaben ist eher unüblich.
Wenn du wirklich versuchst etwas über 1000 Spalten zu verteilen, dann machst du was verkehrt.

mfg Balmung

Ich erkläre es dir du kannst nach ausbaustufe des Hauses bis zum ende des games max 500 Personen haben. Diese Personen können waffen tragen, schutzwesten usw.

Es gibt natürlich verschiedene arten waffen und alles. aber die haben keine genauen werte sondern z.b präzision 98 -90 so du bekommst also unterschiedliche waffen. davon kann man am ende des games + inventar 750 haben … so jetzt muss ich 750 waffen unterteilen dies kann ich tun indem ich sie auf die 5 “haushalte” aufteile oder soll ich für jede Waffensorte usw. eine neue Tabelle verwenden? dann wäre ich bei der jetzigen auswahl schon bei 18 waffen + 3 event waffen dann kommen noch schusswesten autos und co dazu? … aber dann müsste ich natürlich bei nem angriff aus allen Tabellen etwas laden ?

(hab schnell geschrieben sry für Rechtschreibfehler -)

Uff, die Erklärung macht es nicht verständlicher.

Jeder Spieler kann also max. 500 Personen haben, aufgeteilt auf max. 5 Haushalte (max. 100 pro Haushalt?).
Und dann hast du 750 Waffen, die du irgendwie auf die Personen/Haushalte verteilen willst?

Wird die Anzahl Personen pro Haushalt als ein einfacher Zahlenwert abgelegt? oder Sind die Personen 500 einzelnen Datensätze in einer Extratabelle, und man kann jeden einzeln verwalten?
Bei letzterem lässt sich natürlich jede Waffe direkt einer Person zuweisen, der Aufwand für den Spieler ist dann natürlich wesentlich höher. Bei ersterem muss man 750 Waffen irgendwie auf 5 Haushalte verteilen… da die Waffen aber alle unterschiedliche Werte haben können kann man das wohl kaum automatisieren…
Die Präzision der Waffen kann man ja allgemein formulieren - so dass sie für alle gilt, und konkrete Zufallswerte erst berechnen wenn sie nötig ist (bei einem Kampf).

Es fehlen einfach viel zu viele Informationen und deine Erklärung scheint mir als würdest du vorraussetzen ich verstehe wovon du redest.

Und eine wichtige Frage die du noch nicht beantwortet hast: Hast du im ersten Beitrag vielleicht einfach nur die Begriffe verdreht? Meintest du vielleicht Zeilen statt Spalten?

Ok ich werde jetzt ziemlich ausführlich ^^

So natürlich bekommt man erst im Laufe des Spiels alles zs. am Anfang hat man natürlich nur eine kleine Menge und auch nur eine “Villa/Haushalt” und man startet mit 4 Personen die leicht bewaffnet sind. Es geht hier um den vertrieb von waren (am rande). So umsu höher die Villa ausgebaut ist desto mehr Personen kann sie beinhalten bis zu einem maximalen lvl, das alleine würde schon zum ausbau 48 Tage dauern also bis dahin ist erstmal lange hin so jetzt hat man beim letzten lvl zurzeit maxmimal 100 Personen pro “haushalt” so jetzt wenn man sich eine waffe kauft bekommt diese bestimmte werte einmal präzision, geschwindigkeit, schussrate und die standard angriffskraft auf die sich dann alles berechnet.

als beispiel: Waffe 1
Präzision: 98-90 %
geschwindigkeit: 1000-1200 kmh
schussrate: 0.3-0.35/sek
angriffskraft: 21-25

Diese Waffe bekommt jetzt Feste werte in diesen Berreichen die durch Zufall generiert werden --> Desto höher Desto unwahrscheinlicher natürlich in dem Festgelegeten Berreich.

So diese Werte habe ich in einer Tabelle und werden dann in der Funktion aufgerufen.

So jetzt muss ich für diesen Haushalt mit Inventar ich bin mir da noch nich so sicher aber Sagen wir mal max 150 Waffen ich weiß noch nicht wie das Invntar mitwächst stellt sich dann erst im spielverlauf raus wenn wir das spiel mal wieder zs testen.

So jetzt muss ich 150 waffen mit den 4 werten speichern das pro haushalt

Jetzt ist die Frage wenn ich es nach Waffen machen würde wäre ja unlogisch er kann ja am ende 150 mal die beste haben… also macht das keinen sinn dann hätte ich ja bei 18 waffen 18 spalten mit 600 spalten bei 4 eigenschaften + 150 wer sie trägt usw. .

Jetzt ist die Frage kann ich alle diese Werte in einem Int speichern und mit substring rausholen so hätte ich natürlich nur 150 spalten da 150 waffen. Geht dies mit substring schneller als wenn ich 600+ spalten hätte? deswegen möchte ich nur mit einer tabelle arbeiten, da die waffen ja immer wechseln können. und so speichere ich sie in 1 tabelle und alles ist beisamen wären es 18 tabellen wären sie ja trotzdem so groß, da man ja trotzdem 150 waffen von einer sorte besitzen könnte.

Du musst nicht für jede Waffe 5~6 Spalten irgendwo reinpacken, sondern für jede Waffen einen Datensatz in einer extra Tabelle, und dort speicherst du dann eine zusätzliche referenz zu einer anderen Tabelle, die die Waffen gruppiert.

Du machst die eine Tabelle für alle(!) gekauften Waffen mit ~7 Spalten/Felder (mehr oder weniger).
z.b. Die Spalten könnten heißen: id, person_id (oder haushalt_id), name, praezision, geschwindigkeit, schussrate, angriffskraft.

person_id oder haushalt_id referenzieren eine ID in der anderen Tabelle für die Personen bzw Haushalte… je nach dem ob du die Waffe einer einzelnen Person zuordnen willst, oder allgemeint dem gesamten Haushalt.

Wenn du es den Haushalten zuweist und ein Haushalt 100 Waffen hat, sind dort eben 100 Datensätze drinne, die alle die selbe haushalt_id haben (aber eine unterschiedliche id).

Wenn du es den Personen zuteilst, findest du dort halt 1~2 Datensätze mit der selben person_id (je nach dem wie viele der Waffen/Gegenstände eine Person haben kann). Und die Tabelle für Personen hat dann vllt eine haushalt_id, die das haushalt referenziert zu dem die Person gehört.

Nun, die genaue Struktur ist nicht relevant, du solltest aber immer daraufhin strukturieren, sehr viele Datensätze zu haben. Da macht es nichts wenn es hundert tausend Datensätze in einer Tabelle sind. Relationale Datenbanksysteme wurden daraufhin optimiert mit sehr viele Datensätze zu hantieren.

mfg Balmung

Okay alles klar danke =) ich wusste nicht das sooo viele datensätze kein problem sind o.O ich mein bei 10 leutz wären dass ja scho 5000 --> 100 50000 und bei 10000 scho 5 mille

Aber dann schonmal vielen dank =)

Wird denn nicht die Schnelligkeit sehr unter dieser hohen last an Datensätzen leiden? ich meine die sind ja dann auch sehr durcheinander zwar mit klarer id, aber wenn ich jetzt bei nem kampf 20 datensätze aufrufen muss die eine an stelle 102 die andere an 1000 bla is das nich sehr geschwindigkeits fressend ?

Solange du die IDs referenzierst (und diese Primärschlüssel sind). Diese sind Indiziert. Der findet die IDs in null-komma-nix. IDs sind keine “Stellen” oder “Positionen” sondern lediglich eine eindeutige Zahl deren genauer Wert relativ egal ist.

Okay alles klar =)

Herzlichen dank an dich und deine Hilfe=), jetzt hab ich was gelernt und kann wieder weiter proggen -. Dir später noch ne Gute Nacht und dem rest von bplaced wünsche ich das natürlich auch =)

LG Passiy

Vielleicht haben ja hier auch ein paar Leute einen Webspace bei 1und1 gehostet und schon versucht, eine etwas größere Datenbank zu sichern. Jedenfalls konfrontierte mich das folgende Problem:
phpmyadmin auf 1und1 konnte die Backupdatei (Gzip) meiner Datenbank nicht finden. Diese benötige ich mich aber, da ich aus sicherheitstechnischen Gründen meine Wordpress Installation aktualisieren wollte und man davor eine Sicherung der MySQL-Daten machen muss.

Der Support von 1und1 meldete sich heute bei mir mit folgender Email:

SSH ist in meinem Paket nicht enthalten, also müsste ich für nächstes Mal auf ein PHP Skript zurück greifen. Bitte, könnte mir da jemand einen hilfreichen Tipp geben, welches das beste Skript für eine solche Aufgabe wäre? Danke im Voraus.