2010-12-01 16 views
1

Ich arbeite ein minimales Spiel mit Java und MySQL. Ich hatte einige Schwierigkeiten damit, meine Tabellen korrekt zu entwerfen. Ich einige Ratschläge benötigen: Lassen Sie mich spezifisch sein, ich habe 3 Klassen:Wie Design-Datenbank für diese Situation?

Knoten

public class Node { 
    private Integer id; 
    private Integer position; 
    private Integer foodTax; 
    private Boolean hasTreasureMap; 
    private Integer currentPlayer; // playerId 

Schatz

public class Treasure { 
    Integer id; 
    private Integer position; // nodeId 
    private Integer goldValue; 

Spieler

public class Player { 
private Integer id; 
private Integer wealth; 
private Integer strength; 
private Integer start; 
private Integer goal; 
private Integer currentPosition; // nodeId 
private Integer currentGoal; // another nodeId 
private Vector<Integer> path; 
private Vector<Integer> treasureIds; 
private int currentMoveIndex; 
Graph<Integer> telescope; 

Ich bin ein Neuling auf mysql und Datenbank im Allgemeinen. Ich denke, dass ich in diesem Fall Fremdschlüssel verwenden muss. Ich bin jedoch immer noch vage, wie ich es umsetzen soll. Außerdem gibt es mehrere Einschränkungen:

  1. Schatz Position ist fest.
  2. Knotenposition ist fix.
  3. Nur Spielerposition kann geändert werden.
  4. Ein Knoten kann immer nur einen Spieler haben (Ich versuche es so einfach wie möglich zu machen, denn wenn zwei Spieler im gleichen Knoten sind, weiß ich nicht, wie ich damit umgehen soll)

Also der einzige Fremdschlüssel hier meiner Meinung nach ist 'currentPlayer' ID der Klasse Node? Bitte korrigieren Sie mich, wenn ich falsch lag. Irgendeine Idee?

Mit freundlichen Grüßen, Chan Nguyen

+0

Welche Art von Daten möchten Sie speichern? Was wirst du damit machen? Es ist schwierig, Tabellen zu entwerfen, wenn nicht klar ist, wofür sie verwendet werden. – FrustratedWithFormsDesigner

+0

Meine Map ist ein zweidimensionales Array von Integer.Also sind alle Positionen ganze Zahlen. Ich werde diese Ganzzahl beim Zeichnen einer Koordinate (x, y) zuordnen. Dies ist jedoch für die Datenbank überhaupt nicht relevant. Danke für deine Antwort. – Chan

Antwort

0

Es ist immer noch nicht klar, was Sie zu speichern sind versucht, aber man konnte eine Tabelle für Knoten haben:

Node 
    id 
    position 
    foodTax 
    hasTreasureMap 
    currentPlayerID /*Refers to Player table*/ 

Treasure 
    id 
    nodeID /* refers to Node table*/ 
    value 

Player 
    id 
    /*unrelated fields such as wealth, strength, start*/ 
    position /*refers to ID in Node*/ 
    currentGoal /*refers to ID in Node*/ 

PlayerTreasures 
    playerID /* refers to Player table*/ 
    treasureID /* refers to Treasure table*/ 

Paths 
    nodeID /*refers to NodeID - I assume that a path is made of Nodes*/ 
    sequenceInPath /*I assume that the ordering in a path matters*/ 
    playerID /*refers to the player who owns this path*/ 

... Ich habe keine Ahnung, was die Telescope ist für. Auch dieser Vorschlag funktioniert möglicherweise nicht, ich weiß nicht genau, was Sie mit diesen Daten machen.

+0

Danke, ich denke ich habe die Idee;) – Chan

1

Ein Fremdschlüssel ist nur die ID eines anderen Datensatzes. Wenn ein Schatz einem Knoten zugeordnet werden soll, können Sie die ID des Knotens in den Schatzdatensatz eintragen.

Nur ein Vorschlag zur Benennung: Rufen Sie Ihre IDs durch den Tabellennamen plus "ID", anstatt nur "ID". Rufen Sie zum Beispiel die ID der Node-Tabelle "nodelid" (oder "node_id" oder etwas Ähnliches) auf. Wenn Sie dann einen Fremdschlüssel in einen Tisch legen, verwenden Sie denselben Namen, so wie Ihr Schatztisch könnte dann die Felder (Schatzid, Nodeid, Goldwert) haben. Dies macht es viel einfacher zu verfolgen, was Sie tun, da die Datenbank komplizierter wird. Ansonsten muss man irgendwie die Tatsache im Auge behalten, dass "Position" eine Knoten-ID und so "currentPosition" ist und vielleicht ein halbes Dutzend anderer Namen. Es macht Ihre Joins offensichtlich, wie zum Beispiel "Wählen Sie was auch immer aus Knoten Join Schatz auf node.nodeid = Schatz.Nodeid".

(Wenn Sie zwei Fremdschlüssel für dieselbe Tabelle haben könnten, zB wo Ihr Player eine aktuelle Knoten-ID und eine Zielknoten-ID hat, müssen Sie etwas komplizierter werden, nennen Sie sie "current_nodeid" und "goal_nodeid" "oder etwas ähnliches. Aber es ist immernoch klar, dass es ein NodeID ist und nicht etwas anderes, wie jemand, der deinen Code liest, dass currentGoal eine Schatz-ID oder eine Gesamtzahl von Goldpunkten oder Dutzenden von anderen Dingen ist.

+0

Danke Jay. Ich nehme Ihre Worte für die Benennung dieser Spalten;) – Chan

Verwandte Themen