【问题标题】:How to design Database for this situation?针对这种情况如何设计数据库?
【发布时间】:2011-05-18 14:30:27
【问题描述】:

我正在使用 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. Treasure 的位置是固定的。
  2. 节点位置已修复。
  3. 只能更改玩家位置。
  4. 一个节点一次只能有一个玩家。(我尽量简化,因为如果同一个节点有两个玩家,我不知道如何处理)

所以我认为这里唯一的外键是 Node 类的 'currentPlayer' id?如果我错了,请纠正我。有什么想法吗?

最好的问候, 陈阮

【问题讨论】:

  • 您要存储什么样的数据?你打算用它做什么?当不清楚它们的用途时,很难帮助设计表格。
  • 我的地图是一个二维整数数组。所以所有位置都是整数。我会在绘图时将此整数映射到坐标(x,y)。但这根本与数据库无关。感谢您的回复。

标签: java sql mysql database-design


【解决方案1】:

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

只是关于命名的建议:通过表名加上“id”来调用您的 ID,而不仅仅是“id”。例如,将节点表的 ID 称为“nodeid”(或“node_id”或类似名称)。然后,当您将外键放入表中时,请使用相同的名称,就像您的 Treasure 表可以具有字段(treasureid、nodeid、goldvalue)一样。随着数据库变得越来越复杂,这使得跟踪您所做的事情变得更加容易。否则,您必须以某种方式跟踪“位置”是节点 ID 和“当前位置”以及可能有六个其他名称的事实。它使您的连接显而易见,例如“从 node.nodeid=treasure.nodeid 上的节点连接宝藏中选择任何内容”。

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

【讨论】:

  • 谢谢杰。我会用你的话来命名这些列;)
【解决方案2】:

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

【讨论】:

  • 谢谢,我想我明白了;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 2018-09-14
  • 2018-07-15
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多