Структура реляционной базы данных по покеру в Техасском Холдеме - PullRequest
2 голосов
/ 12 сентября 2010

Я планирую реляционную базу данных для хранения данных игры в покер (например, что будет включено в историю рук).Я хотел бы помочь выяснить, как спроектировать ассоциации.Кажется, что должно быть 4 модели: Game, Hand, Player и Action (одно действие данного игрока, например, рейз, фолд, колл).Позвольте мне выложить то, что у меня есть:

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

Имеет ли это смысл?

Ответы [ 2 ]

1 голос
/ 12 сентября 2010

Если вы планируете использовать has_and_belongs_to_many, вам, вероятно, следует перейти на использование has_many ..., :through, так как им намного легче управлять.У вас уже есть модель Action, которая делает то, что вам нужно, без необходимости создания некоторых таблиц соединения:

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

Как правило, чем меньше таблиц вы задействовали в своих запросах, тем быстрее они будут выполняться.Использование любого вида JOIN приведет к непредсказуемой производительности запросов.

Обязательно тщательно индексируйте свои таблицы и используйте оператор EXAMINE, чтобы убедиться, что вы используете индексы при их использовании.Сканирование таблиц будет чрезвычайно болезненным, если вы загрузите это миллионами записей, и в таких играх это не займет много времени, так как одна рука включает в себя десятки действий, и типично играть десятки раздач в час.

1 голос
/ 12 сентября 2010

Имеет смысл в качестве первого черновика.Связи, возникающие из того, что у вас есть, дают следующие таблицы и ключи:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...