Запись матчей спортивной команды - отношение многих ко многим? - PullRequest
5 голосов
/ 13 февраля 2011

Я новичок в Ruby on Rails, но в прошлом я создал несколько простых приложений.Сейчас я делаю что-то более сложное, и я нахожусь в тупике при проектировании базы данных.

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

1) На странице конкретной команды я хотел бы показать список матчей, в которых участвовала команда.

2) Iхотел бы вести учет побед, поражений и связей каждой команды для отображения на странице турнирной таблицы лиги.

В пункте # 1 я решил, что это будет отношение многих ко многим,У команды много матчей, а у матча много команд (ну, на самом деле, только две).Я немного озадачен тем, как и где хранить статистику для каждой команды.Где я храню выигрыши / проигрыши / связи?Являются ли они частью таблицы команды?Если так, если бы у меня была страница с командным зачетом, показывающая каждую команду с потерями / связями, как бы я получил эту информацию?

Ответы [ 4 ]

3 голосов
/ 13 февраля 2011

Это на самом деле не закончено, но, возможно, это поможет вам или кому-то еще сдвинуться с места.

Я сосредотачиваюсь только на том, как структурировать отношения между командамии спички.Я полагаю, что, по крайней мере, часть решения заключается в использовании полиморфной ассоциации, а часть, возможно, будет самостоятельным объединением.Я клянусь, что это прямо передо мной, и я не вижу этого.

Делая шаги ребенка здесь, предполагая, что у вас есть такой стол для вашего стола Матчей ...

  id   |   home_team_id  |  away_team_id  |  home_team_score  |  away_team_score

Вы можетеустановите это в своих моделях с этими ассоциациями:

class Match
  belongs_to :home_team, :class_name => :team
  belongs_to :away_team, :class_name => :team
end

class Team
  has_many :home_matches, :foreign_key => :home_team_id, :class_name => :matches
  has_many :away_matches, :foreign_key => :away_team_id, :class_name => :matches
end

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

См. Руководство по Rails по полиморфным ассоциациям и посмотрите, поможет ли это вам увидеть то, что я не могу.

0 голосов
/ 14 апреля 2015

Я думаю, что это можно сделать следующим образом:

class Team < ActiveRecord::Base
    has_many :games
    has_many :matches,:through => :games
end

class Matche < ActiveRecord::Base
    has_many :games
    has_many :teams,:through => :games
end

class Game < ActiveRecord::Base
    belongs_to :team
    belongs_to :match
end

, и если вам нужно найти общее количество матчей, сыгранных какой-либо командой, тогда

= team.games.count

, если вам нужно найти общее количество выигранныхматчи любой команды тогда

= team.games.where(:winner => true).count
0 голосов
/ 13 февраля 2011

Я выхожу из игры, но подумайте:

tblTeam
    TeamID
    TeamName
     . . . OtherTeamFields

tblMatch
    MatchID
    MatchDate
    MatchLocationID
     . . . OtherMatchFields

tblTeam_Matches
    TeamID FK on tblTeam.TeamID
    MatchID FK on tblMatchID
    TeamStanding (Win, Loss, Tie)

Структура выше имеет некоторые плюсы и минусы. Что касается профессионалов, то результат для каждой команды, участвующей в матче, сохраняется должным образом с учетом отношения команды к этому матчу. Можно получить результаты для каждой команды через ряд совпадений, установив критерии для TeamID и TeamStanding (т. Е. "WHERE TeamStanding =" Win ").

Однако есть более сложный, но, вероятно, более масштабируемый и полезный способ, где вы определяете поле TeamScore для tblTeam_Matches. В этом случае победитель матча будет определяться довольно сложной серией подзапросов (Под «трудным» я подразумеваю «сложный» для МЕНЯ. Держу пари, что на SO есть люди, которые могут быстро выдать ответ… немного дразнилки).

Я полагаю, что второй вариант был бы более "правильным" способом сделать это, но я испортил некоторые версии:

StatsQuery:
    TeamName
    TotalMatches
    Wins
    Losses
    Ties

Мне было тяжело. Коррелированные подзапросы НЕ являются моей сильной стороной (пока).

В любом случае, надеюсь, это даст вам пищу для размышлений. , ,

0 голосов
/ 13 февраля 2011

Я бы предложил не создавать здесь традиционные отношения «многие ко многим». Вместо этого у вас будет всего две таблицы: Teams и Matches.

Каждая команда будет обозначена строкой в ​​Teams и будет иметь уникальный идентификатор, такой как TeamId.

Таблица Matches будет иметь следующие столбцы:

  • MatchId - синтетический первичный ключ
  • SeasonId - указывает сезон, в котором состоялся матч
  • HomeTeamId - хозяева поля
  • VisitngTeamId - команда гостей
  • HomeTeamScore
  • VisitngTeamScore
  • ... Любая другая статистика, которую вы хотите сохранить для индивидуального матча

Полагаю, у вас есть представление о домашних и гостевых командах. Если нет, вы можете просто назвать эти столбцы Team1Id и Team2Id или что-то в этом роде.

Я немного озадачен тем, как и где хранить статистику для каждой команды. Где я храню выигрыши / проигрыши / ничьи?

Победы, поражения и связи неявны в таблице Matches - вы можете запросить это, чтобы получить отчет команды. Например, следующий запрос возвращает выигрыши, поражения и связи для команды X:

-- Wins
SELECT COUNT(*) 
FROM Matches 
WHERE SeasonID = @SeasonID AND 
    (HomeTeamId = X AND HomeTeamScore > VisitingTeamScore) OR 
    (VisitingTeamId = X AND VisitingTeamScore > HomeTeamScore)

-- Loses
SELECT COUNT(*) 
FROM Matches 
WHERE SeasonID = @SeasonID AND 
    (HomeTeamId = X AND HomeTeamScore < VisitingTeamScore) OR 
    (VisitingTeamId = X AND VisitingTeamScore < HomeTeamScore)

-- Ties
SELECT COUNT(*) 
FROM Matches 
WHERE SeasonID = @SeasonID AND 
    (HomeTeamId = X OR VisitingTeamId = X) 
    AND VisitingTeamScore = HomeTeamScore

Даже если вы хотите денормализовать модель данных и сохранить эту информацию для каждой команды, вы не захотите делать это в таблице Teams, потому что вы можете знать, сколько выигрышей / проигрышей / ничьих у команды для данного сезона. (Я полагаю, что команда может держаться вместе в течение нескольких сезонов. Если это не так, не обращайте внимания.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...