【问题标题】:How to represent a Football match model?如何表示足球比赛模型?
【发布时间】:2021-11-29 13:49:29
【问题描述】:

目前我正在开发一个使用以下实体运行的应用程序:

  • 足球比赛
  • 团队

我正在处理一个难题:如何表示 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; }
}

【问题讨论】:

    标签: c# database entity-framework database-design model


    【解决方案1】:

    我会推荐选项 1:

    class FootballMatch
    {
        public Team FirstTeam { get; set; }
        public Team SecondTeam { get; set; }
        public DateTime Date { get; set; }
    }
    

    原因是您确定在一场比赛中总会有两支球队。我理解不愿意让团队被“排序”,即使顺序并不重要,但这种设计仍然最符合实际领域。

    此外,这将使您在数据库表设计方面的工作更加轻松。您不想将match 表拆分为matchmatch_teams 表。这将大大降低数据库性能,并使查询数据的整体难度和效率降低。它还为match_teams 表中的条目打开了大门,这些条目在每场比赛中关联多于或少于两支球队。

    事实上,我建议将两个 team_id 字段都设为不可为空。通过这种方式,您可以强制让一场比赛始终只有两支球队。

    确实,要查询一个团队的所有匹配项(如您的第三个代码 sn-p 中所示),您的查询现在必须将两个外键字段覆盖到团队表中(例如 team1_idteam2_id )。尽管如此,它更干净,性能更高。

    更新

    关于记分,我建议在同一个match 表上对应两个团队的两个数字分数字段,即:team1_idteam2_idscore1score2。可以将相同的设计应用于相应的域对象,如下所示:

    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.
    }
    

    【讨论】:

    • 谢谢,有道理!但是还有一个要求来了——比赛也必须保持比分,并且会有这样的查询:给我X队打进2球的比赛。我认为再增加一个属性(得分,如 2 - 4)将打破 2NF,因为标记的进球数(得分字符串的一部分)更多地属于球队而不是比赛本身......你有知道如何处理吗?顺便说一句,谢谢你的回答! (我不能投票,因为我没有 15 个代表)
    • 我不会太担心 2NF。在我们的足球应用程序中,我们使用比赛表中的 team1_id、team2_id、score1 和 score2 列完全实现了这种设计
    • 更重要的是,分数是比赛的固有属性,而不是球队的属性
    • 好吧,你说服了我!我会选择第一个选项。谢谢!
    • 祝你好运!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多