我是Ruby on Rails的新手,但过去我创建了一些简单的应用程序。现在我正在做一些更复杂的事情,我对数据库设计感到困惑。
我正在创建一个体育联盟经理,我需要一些关于如何建立团队和游戏之间关系的建议,以指引我朝着正确的方向发展。每次在两支球队之间进行比赛时,都会记录比赛。我希望能够做到以下几点:
1)在特定团队的页面上,我想显示团队参与的匹配列表。
2)我想记录每支球队在联赛积分榜上的胜负,失误和关系。
在第1点,我认为这将是一个多对多关系,也就是说,一个团队有很多匹配,一个匹配有很多团队(好吧,实际上只有两个)。我有点难过的一点是如何以及在何处存储每个团队的统计数据。我在哪里保持胜负/关系?他们是Team表的一部分吗?如果是这样,如果我有一个团队排名的页面显示每个团队有失/关系,我将如何获得这些信息?
答案 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)
我建议不要在这里建立传统的多对多关系。相反,您只有两个表: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
表中执行此操作,因为您可能想知道有多少赢/输/关系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