2010-12-01 27 views
1

我正在用Java和mysql进行一个小型游戏。我遇到了一些如何正确设计我的表的困难。我需要一些建议:让我具体的,我有3类:如何为这种情况设计数据库?

节点

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

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

球员

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; 

我是一个新手到MySQL和一般的数据库。我认为在这种情况下我必须使用外键。但是,我仍然很模糊如何实现它。此外,还有几个限制条件:

  1. 宝藏的位置是固定的。
  2. 节点位置已修复。
  3. 只有玩家的位置可以改变。
  4. 一个节点一次只能有一个播放器(我试图尽量简化它,如果在同一节点有两个播放器,我不知道该如何处理它)

所以我认为这里唯一的外键是类节点的'currentPlayer'id?如果我错了,请纠正我。任何想法?

最好的问候,陈 阮

+0

你想存储什么样的数据?你打算怎么处理它?当不清楚它们将用于什么时,很难帮助设计表格。 – FrustratedWithFormsDesigner 2010-12-01 16:24:47

+0

我的地图是Integer的二维数组。所以所有的位置都是整数。绘图时,我会将此整数映射到坐标(x,y)。但是这根本与数据库无关。感谢您的回复。 – Chan 2010-12-01 16:28:19

回答

0

它仍然不清楚你想要什么存储,但你可以为节点的表:

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

...我不知道是什么Telescope是。再一次,这个建议可能不起作用,我不确定你对这些数据做了什么。

+0

谢谢,我想我明白了;) – Chan 2010-12-07 18:52:20

1

外键只是另一个记录的ID。如果Treasure应该与节点相关联,那么您可以将节点的ID放入Treasure记录中。

只是一个关于命名的建议:通过表名加“id”来调用你的ID,而不仅仅是“id”。例如,调用节点表“nodeid”(或“node_id”或类似的东西)的ID。然后,当你把一个外键放在一个表中时,使用相同的名字,就像你的宝藏表可以有字段(宝藏,nodeid,goldvalue)。这使得在数据库变得越来越复杂时跟踪你的工作变得更加容易。否则,你必须以某种方式记录“位置”是节点ID和ic“currentPosition”以及其他六个其他名称的事实。它让你的连接变得明显,就像“从node.nodeid = treasure.nodeid中选择节点加入宝藏中的任何一个”。 (如果你可以在同一个表中有两个外键,比如你的播放器有一个当前节点ID和一个目标节点ID,那么你必须稍微复杂一点,把它们称为“current_nodeid”和“goal_nodeid “或其他一些东西,但它仍然清楚这是一个nodeid而不是别的东西,就像其他人阅读你的代码可能会假设currentGoal是一个宝藏ID或黄金总点或任何其他几十个其他东西。)

相关问题