如何表示足球比赛模型?
How to represent a Football match model?
目前我正在开发一个与以下实体一起运行的应用程序:
- 足球比赛
- 团队
我正在处理一个难题:如何表示 FootballMatch 域实体,这些选项中哪个最合适?还有,足球比赛有比分。
class FootballMatch
{
public Team FirstTeam { get; set; }
public Team SecondTeam { get; set; }
public DateTime Date { get; set; }
public string Score { get; set; } // like 0 - 3 (FirstTeam - SecondTeam)
}
或
class FootballMatch
{
public IEnumerable<Team> Teams { get; set; }
public DateTime Date { get; set; }
public string Score { get; set; } // like 0 - 3 (Teams[0] - Teams[1])
}
或(我认为这是最好的,改变我的想法)
public class TeamPlay
{
public Team Team { get; set; }
public FootballMatch Match { get; set; }
public int Goals { get; set; }
}
public class FootballMatch
{
public TeamPlay FirstTeam { get; set; }
public TeamPlay SecondTeam { get; set; }
public DateTime Date { get; set; }
}
任何指导/建议将不胜感激!如果总是只有 2 支足球队参加一场足球比赛,我不知道是否可以收集球队。
请注意,我希望球队有一份参加过的足球比赛列表
public class Team
{
public string Name { get; set; }
public IEnumerable<FootbalMatch> AttendedMatches { get; set; }
}
我会推荐选项 1:
class FootballMatch
{
public Team FirstTeam { get; set; }
public Team SecondTeam { get; set; }
public DateTime Date { get; set; }
}
原因是您肯定知道一场比赛中总是恰好有两支球队。我理解不愿意让团队被“排序”,即使顺序并不重要,但这种设计仍然与实际领域最接近。
此外,这将使您在数据库 table 设计方面更加轻松。您不想将 match
table 拆分为 match
和 match_teams
table。这将大大降低数据库性能,并使查询数据的整体难度和效率降低。它还为 match_teams
table 中的条目打开了大门,这些条目在每场比赛中关联多于或少于两支球队。
事实上,我建议让两个 team_id
字段都不可为空。通过这种方式,您可以确保一场比赛始终只有两支队伍。
的确,要查询一支球队的所有比赛(如您的第三个代码片段所示),您的查询现在必须涵盖球队 table 中的两个外键字段(例如 team1_id
和 team2_id
)。尽管如此,它更清洁、更高效。
更新
关于记分,我建议在相同的 match
table 上使用两个对应于两支球队的数字分数字段,即:team1_id
、team2_id
、score1
和 score2
。同样的设计可以应用于相应的领域对象,它看起来像这样:
class Match
{
public Team Team1 { get; set; }
public Team Team2 { get; set; }
public short Score1 { get; set; }
public short Score2 { get; set; }
public DateTime Date { get; set; }
//Stadium, Location, etc.
}
目前我正在开发一个与以下实体一起运行的应用程序:
- 足球比赛
- 团队
我正在处理一个难题:如何表示 FootballMatch 域实体,这些选项中哪个最合适?还有,足球比赛有比分。
class FootballMatch
{
public Team FirstTeam { get; set; }
public Team SecondTeam { get; set; }
public DateTime Date { get; set; }
public string Score { get; set; } // like 0 - 3 (FirstTeam - SecondTeam)
}
或
class FootballMatch
{
public IEnumerable<Team> Teams { get; set; }
public DateTime Date { get; set; }
public string Score { get; set; } // like 0 - 3 (Teams[0] - Teams[1])
}
或(我认为这是最好的,改变我的想法)
public class TeamPlay
{
public Team Team { get; set; }
public FootballMatch Match { get; set; }
public int Goals { get; set; }
}
public class FootballMatch
{
public TeamPlay FirstTeam { get; set; }
public TeamPlay SecondTeam { get; set; }
public DateTime Date { get; set; }
}
任何指导/建议将不胜感激!如果总是只有 2 支足球队参加一场足球比赛,我不知道是否可以收集球队。
请注意,我希望球队有一份参加过的足球比赛列表
public class Team
{
public string Name { get; set; }
public IEnumerable<FootbalMatch> AttendedMatches { get; set; }
}
我会推荐选项 1:
class FootballMatch
{
public Team FirstTeam { get; set; }
public Team SecondTeam { get; set; }
public DateTime Date { get; set; }
}
原因是您肯定知道一场比赛中总是恰好有两支球队。我理解不愿意让团队被“排序”,即使顺序并不重要,但这种设计仍然与实际领域最接近。
此外,这将使您在数据库 table 设计方面更加轻松。您不想将 match
table 拆分为 match
和 match_teams
table。这将大大降低数据库性能,并使查询数据的整体难度和效率降低。它还为 match_teams
table 中的条目打开了大门,这些条目在每场比赛中关联多于或少于两支球队。
事实上,我建议让两个 team_id
字段都不可为空。通过这种方式,您可以确保一场比赛始终只有两支队伍。
的确,要查询一支球队的所有比赛(如您的第三个代码片段所示),您的查询现在必须涵盖球队 table 中的两个外键字段(例如 team1_id
和 team2_id
)。尽管如此,它更清洁、更高效。
更新
关于记分,我建议在相同的 match
table 上使用两个对应于两支球队的数字分数字段,即:team1_id
、team2_id
、score1
和 score2
。同样的设计可以应用于相应的领域对象,它看起来像这样:
class Match
{
public Team Team1 { get; set; }
public Team Team2 { get; set; }
public short Score1 { get; set; }
public short Score2 { get; set; }
public DateTime Date { get; set; }
//Stadium, Location, etc.
}