2010-12-01 2 views
1

Je travaille sur un jeu minimal avec Java et MySQL. J'ai rencontré quelques difficultés avec la façon de concevoir mes tables correctement. J'ai besoin de quelques conseils: Permettez-moi d'être précis, j'ai 3 classes:Comment concevoir la base de données pour cette situation?

Noeud

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

Trésor

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

Joueur

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; 

Je suis un débutant à mysql , et base de données en général. Je pense que je dois utiliser une clé étrangère dans ce cas. Cependant, je suis encore vague sur la façon de l'implémenter. En outre, il existe plusieurs contraintes:

  1. La position du trésor est fixe.
  2. La position du nœud est fixe.
  3. Seule la position du lecteur peut être modifiée.
  4. Un nœud ne peut avoir qu'un joueur à la fois (j'essaie de le rendre aussi simple que possible, car s'il y a deux joueurs dans le même nœud, je ne sais pas comment le gérer)

Donc la seule clé étrangère ici est, à mon avis, l'identifiant 'currentPlayer' de la classe Node? Corrigez-moi si j'avais tort. Une idée?

Meilleures salutations, Chan Nguyen

+0

Quel type de données voulez-vous stocker? Qu'est-ce que tu vas faire avec ça? Il est difficile d'aider à concevoir des tableaux quand on ne sait pas à quoi ils serviront. – FrustratedWithFormsDesigner

+0

Ma carte est un tableau bidimensionnel d'entier.Donc, toutes les positions sont des entiers. Je vais mapper cet entier à une coordonnée (x, y) lors du dessin. Mais ce n'est pas du tout pertinent pour la base de données. Merci pour votre réponse. – Chan

Répondre

0

IT est toujours pas clair ce que vous essayez de stocker, mais vous pouvez avoir une table pour les nœuds:

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*/ 

... Je ne sais pas ce que le Telescope est pour. Encore une fois, cette suggestion pourrait ne pas fonctionner, je ne sais pas exactement ce que vous faites avec ces données.

+0

Merci, je pense que j'ai eu l'idée;) – Chan

1

Une clé étrangère est simplement l'identifiant d'un autre enregistrement. Si un trésor est supposé être associé à un nœud, vous pouvez placer l'identifiant du nœud dans l'enregistrement Trésor. Juste une suggestion sur le nommage: Appelez vos ID par le nom de la table plus "id", plutôt que simplement "id". Par exemple, appelez l'ID de la table Node "nodeid" (ou "node_id" ou quelque chose de similaire). Ensuite, lorsque vous placez une clé étrangère dans une table, utilisez le même nom, comme votre table Treasure pourrait alors avoir les champs (treasureid, nodeid, goldvalue). Cela rend beaucoup plus facile de garder une trace de ce que vous faites au fur et à mesure que la base de données devient plus compliquée. Sinon, vous devez en quelque sorte garder une trace du fait que "position" est un identifiant de nœud et donc "currentPosition" ic et peut-être une demi-douzaine d'autres noms. Cela rend vos jointures évidentes, comme "sélectionner n'importe quel noeud de jointure de noeud sur node.nodeid = treasure.nodeid". (Si vous pouvez avoir deux clés étrangères dans la même table, comme si votre joueur a un identifiant de nœud courant et un identifiant de nœud de but, vous devez vous compliquer un peu, appelez-les "current_nodeid" et "goal_nodeid" "ou un tel.Il est encore clair que c'est un nodeid et pas autre chose, comme quelqu'un d'autre qui lit votre code peut supposer que currentGoal est un ID Trésor ou un nombre total de points d'or ou l'une des dizaines d'autres choses.)

+0

Merci Jay. Je vais prendre vos mots pour nommer ces colonnes;) – Chan

Questions connexes