记录运动队的比赛 - 多对多关系?

时间:2011-02-13 03:01:28

标签: ruby-on-rails database-design many-to-many

我是Ruby on Rails的新手,但过去我创建了一些简单的应用程序。现在我正在做一些更复杂的事情,我对数据库设计感到困惑。

我正在创建一个体育联盟经理,我需要一些关于如何建立团队和游戏之间关系的建议,以指引我朝着正确的方向发展。每次在两支球队之间进行比赛时,都会记录比赛。我希望能够做到以下几点:

1)在特定团队的页面上,我想显示团队参与的匹配列表。

2)我想记录每支球队在联赛积分榜上的胜负,失误和关系。

在第1点,我认为这将是一个多对多关系,也就是说,一个团队有很多匹配,一个匹配有很多团队(好吧,实际上只有两个)。我有点难过的一点是如何以及在何处存储每个团队的统计数据。我在哪里保持胜负/关系?他们是Team表的一部分吗?如果是这样,如果我有一个团队排名的页面显示每个团队有失/关系,我将如何获得这些信息?

4 个答案:

答案 0 :(得分:3)

这还没有真正完成,但也许这会帮助你或其他人在这里滚球。

我专注于如何构建团队和匹配之间的关系。至少部分解决方案在于使用多态关联,我相信,其中一部分可能是自联接。我发誓它就在我面前,我没有看到它。

在这里采取宝贝步骤,假设你的匹配表有这样的表......

  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

显而易见的问题是,当真的应该只有一个时,有两种关系。这就是为什么我认为多态关联可以提供帮助,但这有点令人费解。

请参阅polymorphic associations上的Rails指南,看看是否有助于您了解我无法做到的事情。

答案 1 :(得分:0)

我建议不要在这里建立传统的多对多关系。相反,您只有两个表:TeamsMatches

每个小组将由Teams中的一行标识,并且具有唯一标识符,例如TeamId

Matches表格如下:

  • MatchId - 合成主键
  • SeasonId - 确定比赛发生的季节
  • HomeTeamId - 主队
  • VisitngTeamId - 客队
  • HomeTeamScore
  • VisitngTeamScore
  • ... 您希望为个人匹配保留的任何其他统计信息

我认为你有家庭和访问团队的概念。如果没有,您只需将这些列命名为Team1IdTeam2Id,或者沿着这些列命名。

  

我有点难以理解的是,如何以及在何处存储每个团队的统计数据。我在哪里保持胜负/关系?

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表中执行此操作,因为您可能想知道有多少赢/输/关系a团队有一个特定的赛季。 (我认为一个团队可能会在多个赛季中坚持下去。如果不是这样的话,请不要理会。)

答案 2 :(得分:0)

我要离开这里,但请考虑:

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“),可以通过一系列匹配检索每个团队的结果。

但是,有一种更复杂但可能更具可扩展性和实用性的方法,您可以在其中为tblTeam_Matches定义TeamScore字段。在这种情况下,比赛获胜者将由一系列相当困难的子查询决定(难度很大,我的意思是对我来说很困难。我打赌这里的人们可以迅速突然出现......但是它有点像脑筋急转弯)。

我认为第二种选择是采用更“合适”的方式,但是我对某些版本的版本感到不满:

StatsQuery:
    TeamName
    TotalMatches
    Wins
    Losses
    Ties

我遇到了困难。相关的子查询不是我的强项(还)。

无论如何,希望能给你一些思考的东西。 。 。

答案 3 :(得分:0)

我认为这可以通过以下方式完成

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