2010-12-01 3 views
1

Я работаю с минимальной игрой с Java и mysql. Я столкнулся с некоторыми трудностями в том, как правильно проектировать мои таблицы. Мне нужно несколько советов: Позвольте мне быть конкретными, у меня есть 3 класса:Как создать базу данных для этой ситуации?

Узел

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

Treasure

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' класса Node? Пожалуйста, поправьте меня, если я ошибаюсь. Есть идеи?

С наилучшими пожеланиями, Чан Нгуен

+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», а не просто «id». Например, вызовите идентификатор таблицы узлов «nodeid» (или «node_id» или что-то подобное). Затем, когда вы помещаете внешний ключ в таблицу, используйте одно и то же имя, например, ваша таблица Treasure может иметь поля (treasureid, nodeid, goldvalue). Это значительно облегчает отслеживание того, что вы делаете по мере усложнения базы данных. В противном случае вам нужно как-то следить за тем, что «позиция» - это идентификатор узла и так далее «currentPosition» и, возможно, полдюжины других имен. Это делает ваши соединения очевидными, например: «выберите все, что связано с соединением узлов, на node.nodeid = treasure.nodeid».

(Если у вас могут быть два внешних ключа в одной таблице, например, если у вашего Игрока есть текущий идентификатор узла и идентификатор узла цели, тогда вам нужно немного усложниться, назовите их «current_nodeid» и «goal_nodeid» »или некоторые из них. Но все же тогда ясно, что это nodeid, а не что-то еще, например, кто-то другой, читающий ваш код, может предположить, что currentGoal - это идентификатор Treasure или общее количество золотых очков или любой другой десятки других вещей.)

Смежные вопросы