如何为这种情况设计数据库?

时间:2010-12-01 16:15:58

标签: java sql mysql database-design

我正在使用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. 一个节点一次只能有一个玩家。(我尽量让它尽可能简单,因为如果同一节点中有两个玩家,我不知道如何处理它)
  5. 所以我认为唯一的外键是类Node的'currentPlayer'id?如果我错了,请纠正我。有什么想法吗?

    祝你好运, Chan Nguyen

2 个答案:

答案 0 :(得分:1)

外键只是另一条记录的id。如果Treasure应该与Node关联,那么您可以将Node的id放在Treasure记录中。

关于命名的建议:通过表名加“id”来调用您的ID,而不仅仅是“id”。例如,调用Node表的“nodeid”(或“node_id”或类似的东西)的ID。然后当你在表中放入一个外键时,使用相同的名称,就像你的Treasure表可以有字段(treasureid,nodeid,goldvalue)。这样可以更容易地跟踪数据库变得更复杂时的操作。否则你必须以某种方式跟踪“位置”是节点id的事实,因此ic“currentPosition”和其他六个名字。它使您的连接变得明显,例如“在node.nodeid = treasure.nodeid上从节点连接宝中选择任何东西”。

(如果你可以有两个外键到同一个表,比如你的Player有一个当前节点id和一个目标节点id,那么你必须变得更复杂,称它们为“current_nodeid”和“goal_nodeid”但是它仍然很清楚,这是一个nodeid,而不是其他东西,就像其他人阅读你的代码一样,可能会认为currentGoal是一个宝藏id或金点总数或其他任何东西。)

答案 1 :(得分:0)

IT仍然不清楚您要存储的是什么,但您可以拥有节点表:

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的用途是什么。同样,这个建议可能不起作用,我不确定你对这些数据做了什么。