Datenbankaufbau - Onlinegame-Forschung

Guten Morgen Habo.
Ich rätsel gerade über den möglichen Datenbank-/Tabellenaufbau in einem Onlinegame zur Option Forschungen.
Zwar arbeite ich zur Zeit nicht an einen Onlinegame, aber die Frage stelle ich mir denoch.
Angenommen es gibt schon Tabellen wie Forschungen (id, name, beschreibung, ..- hier sind alle möglichen Forschungen aufgeführt), Spieler (id, name, passwd), Wer_forscht_was (id, spielerid, forschungenid, beginn, ende,..- Beziehungstabelle für Forschungen und Spieler).
Nun das Problem. Die Strategiespielzocker wissen sicher das man in manchen Spiel bestimmte Forschungen erst abgeschlossen haben muss, damit man die nächste eröffnet bekommt.
Aber wie schreib ich das in einer SQL-Tabelle, das ich für eine bestimmte Forschung erst eine andere benötige.

Meine Idee war gewesen, ich mache in der Forschungentabelle, für jede einzelne Forschung eine neue Spalte und gebe den Feldern dann entweder den Wert 0 oder 1. 0 heißt - Forschung wird nicht für die Forschung benötigt, 1 heißt - sie wird für die Forschung benötigt.
Das würde etwa so aussehen: (id, name, beschreibung, forschung1, forschung2, ...).
Andere Idee wäre, für die Forschungstabelle eine Beziehungstabelle für sich selbst zu machen. Etwa so (id, forschungsid, forschungbenoetigtid) Das hieße dann, das die Forschungsid die eigentliche Forschung ist und dahinter eine Forschung steht die für diese Forschung benötigt wird. Aber wenn ich nun für die eine Forschung mehrere Forschungen benötige, muss ich für die eine Forschung einen neuen Datensatz, mit einer weiteren, benötigten Forschung anlegen. Das gibt böse Doppelungen. Hinzu könnte ja auch noch kommen das die Forschungen durch nochmaliges Forschen eine Stufe steigen.
Nun könnte es ja auch passieren das man für eine Forschung eine bestimmte Stufe der anderen Forschung benötigt. Bei meinen Vorschlägen müsste ich die Tabellen nur etwas umändern. Beim Vorschlag 1, wären die Stufen dann die Zahlen. Buchstaben könnte ich dann auch zulassen (z.B. so x=nicht benötigt, 0=benötigt aber keine Stufe, 5=benötigt Stufe 5).
Bei meinem zweiten Vorschlag würde ich noch eine Spalte aufbauen, die ähnliche Werte wie oben steht, beinhaltet.

Kalkuliert bitte das Stufensystem mit ein.

Nunja, nun frage ich euch wie ihr die Datenbank oder Tabellen aufbauen würdet?

In Zeiten von platzsparenden und leistungsschwachen Hostern sollten man ja schon vorherein darauf achten wie man die Datenbank anlegt.
 
Das lässt sich ziemlich simpel lösen:
Jede Forschung hat ja schon eine ID. Also reicht es, wenn du der Tabelle mit den Forschungsobjekten eine Spalte "abhaengigkeiten" hinzufügst, in die du die eine komma-separierte Liste der abhängigen IDs eingibst und die du dann einfach mit PHP bei den Kommas aufspaltest und in ein Array lädst.
 
Im Zuge der Normalisierung könnte man diese m:n-Beziehung aber auch in einer eigenen Abhängigkeitstabelle mit 2 Fremdschlüsseln auflösen ;)
 
Also ich würde und habe das ganze per php realisiert, indem du in die spielertabelle für jede forschung ne spalte machst also f$name der foschung. Dann liest du den wert aus und wenn er 1 ist, kannste das abhängige gebäude bauen bei 0 nicht. Bei interess kann ich dir den genauen code geben.
 
Danke für eure Antworten

@bitmuncher
Das würde ja gegen die Normalisierung sprechen. Aber wenn man die Daten nicht nach den benötigten Forschungen ordnen muss, wäre es schon eine Lösung.

@LX
Du meinst sicher im Bezug auf bitmunchers Vorschlag.
Dann würde das nach meinen 2. Vorschlag klingen:

Andere Idee wäre, für die Forschungstabelle eine Beziehungstabelle für sich selbst zu machen. Etwa so (id, forschungsid, forschungbenoetigtid) Das hieße dann, das die Forschungsid die eigentliche Forschung ist und dahinter eine Forschung steht die für diese Forschung benötigt wird.

Oder meintest du es etwas anders?

@manutro
Das klingt einerseits nach meinen ersten Vorschlag:

Meine Idee war gewesen, ich mache in der Forschungentabelle, für jede einzelne Forschung eine neue Spalte und gebe den Feldern dann entweder den Wert 0 oder 1. 0 heißt - Forschung wird nicht für die Forschung benötigt, 1 heißt - sie wird für die Forschung benötigt.
Das würde etwa so aussehen: (id, name, beschreibung, forschung1, forschung2, ...).

Aber anderseits auch nicht, denn ich verstehe nicht ganz dein f$name.
Würde das heißen, das du für eine Spalte diesen Wert eintragen würdest, der sich aber immer ändern kann. Oder kommt dies nur aus dein PHP, wo der Wert f$name mit einen Spaltennamen verglichen wird?
Wenn ich das jetzt nicht richtig verstanden habe, würde ich dich um deinen PHP-Code bitten. Natürlich wenn es nicht große Mühe macht.
 
Da man Grundsaetzlich immer davon ausgehen muss das Projekt sich aendern ist die Idee das selbst
in Tabellen (felder) zu packen keine gute Idee.

Ein Feld mit einer Liste von werten die Abhaengkeiten anzeigen macht Sinn.
Dazu braucht man ein Feld mit einer Liste die auffuehrt welche abhaengikeiten erfuellt sind.
Dazu muesste man jedoch einen kleinen Parser bauen..aber keine grosse Sache.

Spaeteres hinzufuegen von Forschungsbereichen bedeutet dann jeweils das hinzufuegen der eigentlichen Sparte, sowie das updaten der abhaengkeiten.

Alternativ koennte man diese "Matrix" in eine extra Tabelle packen.

Forschungen ( A B C ...):

A B C D E F
A x
B x
C x x x
D x x
E
F x x x

Da koennten dann 2 gueltige Werte stehen.
1 = abhaengigkeit nicht erfuellt
2 = abhaengikeit erfuellt

In Zeiten von platzsparenden und leistungsschwachen Hostern sollten man ja schon vorherein darauf achten wie man die Datenbank anlegt.

das ist wumpe wenn die Leute elendig lange, blockierende selects ausfuehren.

Erfahrungsgemaesz hinkt es in 95% der performanceprobleme durch schlechten code und
schlampige DB administration.

EDIT:

Meine "Tabelle" hat sich zerlegt..aber ich hoffe du weiszt was ich meine...
 
wenn garantiert ist, dass nur EINE abhängigkeit besteht, dann bietet sich eine baumstruktur an. weiterhin wird von dieser tabelle beinahe nur lesend zugegriffen und somit wuerde sich das "Nested Set Modell" anbieten.

[edit]wenn mehrere abhängigkeiten bestehen, könnte man ev den baum nicht wie vom stamm --> blätter sondern von den blättern --> stamm betrachten. man müsste testen inwiefern so effiziente abfragen möglich sind.
die administration bzw wartung/änderung von diesen einträgen wären dann einfach ein wenig umständlich[edit]
 
Ja genau, also du machst einfach für jede Forschung ne spalte das "$name" steht einfach dafür, z.b. fmanuer, fhaus... wenn di erforscht sind haben die den wert 1 ansonsten 0.
und dann nimmst du folgenden
PHP:
$abfrage = "SELECT fmauer FROM spieler WHERE session = '$id'";
$ergebnis = mysql_query($abfrage);
  
while($row = mysql_fetch_object($ergebnis))
    {
    $fmauer = $row->fmauer;
    };

if ($fmauer == "1")
{
echo "Ist erforscht<br>";
}
else 
{
echo "Da das nicht erforscht ist kannste es nicht bauen<br>";
}
 
Danke nochmal

@Gulliver
Irgendwie verstehe ich dein Vorschlag nicht.

Original von Gulliver
Da man Grundsaetzlich immer davon ausgehen muss das Projekt sich aendern ist die Idee das selbst
in Tabellen (felder) zu packen keine gute Idee.

Ein andere Idee, die mir schon kam wäre es mit Arrays zu machen.
Dies ist eine Möglichkeit, die einpaar Selectabfragen ersparen würde.

@soox
Du würdest zu dieser Thematik von SQL abraten und andere Datenbanken empfehlen?

@manutro
Hast du schon selbst ein Onlinegame mit mehreren Anwendern am laufen, dass diese Struktur nutzt?
Und wenn ja, wieviel Forschungen hast du denn, die du in der Spielertabelle stehen hast?
 
Original von Prometheus
@soox
Du würdest zu dieser Thematik von SQL abraten und andere Datenbanken empfehlen?

nein. denke nicht, dass es sinn macht nur für diese kleine aufgabe eine andere technologie zu nutzen.
das erwähnte "Nested Set Modell" beschreibt wie man baumstrukturen effizient in datenbanktabellen ablegt (sofern man wenige updates hat).


unter dem strich muss man sich jedoch immer fragen ob sich der ertrag rechtfertigt. wenn du nur 20 eintraege hast und diese aendern sich selten, ist es wohl am einfachsten diese in einem configfile zu definieren. dort kannst du dann auch statisch hinterlegen welche abhaengigkeiten vorhanden sind.

das mit der baumstruktur bringt nur was wenn es viele forschungen gibt und diese nicht nur von solchen forschungen abhänig sind, welche selbst keine forschungen voraussetzten (-> baumstrukturen welche mehr als 2 knoten in die tiefe gehen)
 
Zurück
Oben