我正在使用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和数据库的新手。我认为在这种情况下我必须使用外键。但是,我仍然模糊如何实现它。此外,还有一些限制因素:
所以我认为唯一的外键是类Node的'currentPlayer'id?如果我错了,请纠正我。有什么想法吗?
祝你好运, Chan Nguyen
答案 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
的用途是什么。同样,这个建议可能不起作用,我不确定你对这些数据做了什么。