2010-09-11 2 views
2

Je prévois une base de données relationnelle pour stocker des données de jeu de poker (comme ce qui serait inclus dans les historiques des mains). Je voudrais de l'aide pour trouver comment concevoir les associations. Il semble qu'il devrait y avoir 4 modèles: Game, Hand, Player et Action (action unique d'un joueur donné, comme relancer, plier, call). Permettez-moi d'exposer ce que j'ai:Structure de base de données relationnelle pour les données de poker Texas Hold'em

class Game < ActiveRecord::Base 
    has_many :hands 
    has_many :actions 
    has_and_belongs_to_many :players 
end 

class Hand < ActiveRecord::Base 
    has_many :actions 
    belongs_to :game 
    has_and_belongs_to_many :players 
end 

class Action < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :hand 
    belongs_to :player 
end 

class Player < ActiveRecord::Base 
    has_and_belongs_to_many :games 
    has_and_belongs_to_many :hands 
    has_many :actions 
end 

Est-ce logique?

Répondre

1

Si vous prévoyez d'utiliser has_and_belongs_to_many, vous devriez probablement passer à l'aide has_many ..., :through car il est beaucoup plus facile à gérer. Vous disposez déjà d'un modèle d'action qui fait ce que vous avez besoin sans avoir à créer une jointure des tables:

class Game < ActiveRecord::Base 
    has_many :hands 
end 

class Hand < ActiveRecord::Base 
    has_many :actions 
    belongs_to :game 

    has_many :players, 
    :through => :actions, 
    :source => :player 
end 

class Action < ActiveRecord::Base 
    belongs_to :game 
    belongs_to :hand 
    belongs_to :player 
end 

class Player < ActiveRecord::Base 
    has_many :actions 
    has_many :played_games, 
    :through => :actions, 
    :as => :game 
    has_many :played_hands, 
    :through => :actions, 
    :as => :hand 
end 

En général, les moins de tables que vous avez impliqués dans vos requêtes, plus vite ils seront exécutés. Impliquer n'importe quel type de JOIN va conduire à des performances de requête imprévisibles. Assurez-vous d'indexer soigneusement vos tables et utilisez l'instruction EXAMINE pour vous assurer que vous utilisez les index. Les scans de table seront extrêmement douloureux si vous chargez des millions d'enregistrements, et cela ne prend pas longtemps dans des jeux comme celui-ci car une seule main implique des dizaines d'actions et il est habituel de jouer des dizaines de mains toutes les heures.

+0

Salut Tadman, merci pour votre aide - c'était très utile. Je comprends comment vous avez configuré les modèles Game, Hand et Action, mais je ne comprends pas encore très bien le modèle Player. Pourriez-vous expliquer à quoi ressemblerait la table Player (c'est-à-dire quelles clés étrangères sont incluses)? Est-ce qu'il y a une colonne de play_hands avec des valeurs de hand_id dedans? Aussi, cela vous dérangerait-il d'expliquer pourquoi le jeu n'est associé qu'à des mains? Merci encore pour votre aide! – rymodi

+0

Vous pouvez naviguer de Game à Player si vous suivez les liens, comme 'game.hands.first.players' ou en créant votre propre requête personnalisée pour vous rejoindre plus efficacement. De plus, une relation 'has_many ...,: through' n'implique pas une nouvelle colonne, elle fonctionnera en tirant parti d'une relation existante. Dans l'exemple que vous avez donné, la table 'players' n'a besoin que d'une colonne' id' pour fonctionner, le reste dépend de vous. L'action est où toutes les relations sont définies. – tadman

1

Cela a du sens en tant que première ébauche. Les associations découlant de ce que vous avez donner les tables et les clés suivantes:

Game  :: Game_id (PK);.... 
Hand  :: Hand_id (PK); Game_id (FK);.... 
Player  :: Player_id (PK); Action_id (FK); 
ActionType :: ActionType_id (PK); Type; 
(Note this table will only have three records - raise, fold, call) 
Action  :: Action_id (PK); ActionType_id (FK); Game_id (FK); Hand_id (FK); Player_id (FK);.... 
PlayerHand :: Player_id (FK); Hand_id (FK); Has_or_Belongs; (PK is (Player_id, Hand_id)) 
GamePlayer :: Game_id (FK); Player_id (FK); Has_or_Belongs; (PK is (Game_id, Player_id)) 
+1

Il vaudra mieux utiliser un entier ou une énumération pour catégoriser le type ActionType. – theodorton

Questions connexes