2011-03-08 57 views
3

我有两个表格,分别命名为TeamsMatches - 我希望能够添加由2个团队组成的Match,但也能够获得特定Team的所有匹配。架构 - 2个外键到相同的主键?

什么我可以做的是:

  • A)做一个多到许多TeamsMatches

  • B)请在 Matches两个额外的列之间的关系 表名为HomeTeamAwayTeam这是外键 指的是Teams中的团队表。

我们都同意这一点声音最好的,因为我知道球队的确切数额将参加比赛,每次 - 对吗?现在

,当谈到申报我的实体这种关系,那么我就需要有2个多到一个关系到Match实体,因为Match实体有指Team 2个外键 - 和正弦外键的数量/引用必须从两个MatchTeam一样,那么我会拥有这样的:

// Team.cs

public class Team 
{ 
    public virtual int ID { get; private set; } 
    public virtual string TeamName { get; set; } 
    public virtual Cup Cup { get; set; } 
    public virtual IList<Match> HomeMatches { get; set; } 
    public virtual IList<Match> AwayMatches { get; set; } 
    public virtual IList<Match> Matches 
    { 
     get { return HomeMatches.Concat(AwayMatches).ToList(); } 
    } 

    public Team() 
    { 
     HomeMatches = new List<Match>(); 
     AwayMatches = new List<Match>(); 
    } 
} 

public class TeamMap : ClassMap<Team> 
{ 
    public TeamMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.TeamName).Not.Nullable(); 
     References(x => x.Cup, "CupID"); 
     HasMany(x => x.HomeMatches).KeyColumn("HomeTeamID").Inverse().Cascade.AllDeleteOrphan(); 
     HasMany(x => x.AwayMatches).KeyColumn("AwayTeamID").Inverse().Cascade.AllDeleteOrphan(); 

     Table("Teams"); 
    } 
} 

// Match.cs

public class Match 
{ 
    public virtual int ID { get; private set; } 
    public virtual Team HomeTeam { get; set; } 
    public virtual Team AwayTeam { get; set; } 
    public virtual int WinnerID { get; set; } 
    public virtual Cup Cup { get; set; } 
} 

public class MatchMap : ClassMap<Match> 
{ 
    public MatchMap() 
    { 
     Id(x => x.ID); 
     Map(x => x.WinnerID); 
     References(x => x.HomeTeam, "HomeTeamID"); 
     References(x => x.AwayTeam, "AwayTeamID"); 
     References(x => x.Cup, "CupID"); 

     Table("Matches"); 
    } 
} 

由于代码显示,那么我将不得不使用.Concat()合并HomeMatches和AwayMatches对于一个团队,让所有的比赛为特定团队..

这真的是最好的方式?

回答

3

B是最好的方式去,因为A是一个红鲱鱼的位。在比赛和球队之间你并不是真的想要很多桌子,但是你不想要他们的原因并不是因为你知道比赛中的球队数量,而是因为比赛实际上是多对多已经有团队合作的关系。

只是在这种情况下,当两个团队之间有多对多的关系时,您称它为匹配,并且它拥有自己的一组属性(时间,日期,位置等)。

比赛应该一定有两个外键队,因为比赛是你的多桌。

1

这实际上可能是最好的选择。我认为你只是有一个问题,因为你需要将两个列表结合在一起来拉取看似简单的查询。但是,您使用的结构不仅仅是关联两个团队,它还提供了一个几乎分层的结构,即HomeTeam = Parent,AwayTeam = Child。

如果你想简单地将两个,您可以创建多到许多像你说:

[Team] 

[MatchTeam] 
TeamID 
MatchID 
IsHomeTeam 

[Match] 
+0

这就是我的想法太开始......但我发现错了有一个多一对多的关系时,只有2支球队可以参加比赛 - 与一个多TO-许多我需要重新发明轮子,并找出如何处理这种情况... – ebb 2011-03-08 15:07:37

+0

确切地说,这就是为什么我认为你已经有“最好”的方式显示。 – Keith 2011-03-08 15:24:18

+0

我猜我的球迷是否.Concat()是一个性能缺陷,当我必须合并主队和客队比赛时,球队已经玩了。 – ebb 2011-03-08 15:57:53

2

在关系模型,它会是这个样子。所以两个外键是好的,HomeTeamIDAwayTeamID就是所谓的角色名称

enter image description here